Ich habe eine Schnittstelle, die einen Vertrag definiert (d. H. Eine Repository
), mit wenigen Implementierungen. Jede Methode in der Schnittstelle stellt ein Feature dar, und ich möchte jedes Feature in seiner Suite-Testklasse testen.JUnit Contract Testing mit Suites
Lassen Sie uns eine UserRepository
Schnittstelle übernehmen wie folgt:
public interface UserRepository {
Set<User> search(String query);
Set<User> findBySomethingSpecific(String criteria1, Integer criteria2);
}
Im Moment, um sicherzustellen, ich die gleichen Testfälle laufen, ich erstellen eine abstrakte Test-Klasse, und jede meiner Implementierungen eine Testklasse, die sich die abstrakte Testklasse.
public abstract UserRepositoryTest {
private UserRepository userRepository;
@Before
public void setUp() {
userRepository = createUserRepository();
}
@Test public void aTestForSearch() { ... }
@Test public void anotherTestForSearch() { ... }
@Test public void aTestForSomethingSpecific() { ... }
@Test public void anotherTestForSomethingSpecific() { ... }
protected abstract UserRepository createUserRepository();
}
//------------------------
public class UserRepositoryImplementationTest extends UserRepositoryTest {
@Override
protected UserRepository createUserRepository() {
return new UserRepositoryImplementation();
}
}
Ich möchte einen Weg finden, diese abstrakte Testklasse in eine Reihe von kleinen Tests zu unterteilen, weil die Testklasse schnell überwältigt wird. Ich habe Test-Suites angeschaut, aber ich verstehe nicht, wie ich eine Suite-Test-Klasse erstellen kann, indem ich meine verschiedenen Implementierungen einfüge.
Als eine Seite nicht, habe ich diese question gefunden, aber einige meiner Repositorys erfordern einige Logik bei der Erstellung (z. B. ConnectionPool
für eine SQL-Implementierung). Ich verwende derzeit das Anti-Muster ServiceLocator
mit verschiedenen Context
Klassen, um die Erstellung zu behandeln, aber das ist static
. Aus diesem Grund hatte ich einen Ansatz für eine Testklasse durch Implementierung, so dass ich den Kontext erstellen und anschließend einfügen kann.
Wie injiziert 'FeatureTestSuite' Abhängigkeiten zu allen zugehörigen Klassen? – MiniW
@MiniW Eine andere Option ist die Verwendung von Junit-Regeln http://StackOverflow.com/a/13489506/1371064 und JUnit-Parameter. Offensichtlich hängt das von der Art des Tests ab, den Sie testen möchten. In meinem Fall verwende ich immer Spring und innject Abhängigkeiten mit seinem Kontext. Hier ein Beispiel wie http://stackoverflow.com/a/14946430/1371064 –