【发布时间】:2016-09-23 08:02:06
【问题描述】:
我有一个定义合同的接口(即Repository),几乎没有实现。接口中的每个方法都代表一个特性,我想在其套件测试类中测试每个特性。
假设UserRepository接口如下:
public interface UserRepository {
Set<User> search(String query);
Set<User> findBySomethingSpecific(String criteria1, Integer criteria2);
}
目前,为了确保运行相同的测试用例,我创建了一个抽象测试类,并且我的每个实现都有一个扩展抽象测试类的测试类。
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();
}
}
我想找到一种方法将这个抽象测试类划分为一组小测试,因为测试类很快就会变得不堪重负。我看过测试套件,但我不明白如何通过注入不同的实现来创建套件测试类。
另一方面,我发现了这个question,但我的一些存储库在创建时需要一些逻辑(例如,ConnectionPool 用于 SQL 实现)。我目前使用具有不同Context 类的反模式ServiceLocator 来处理创建,但这是static。这就是为什么我有一个通过实现来测试类的方法,所以我可以创建上下文并在之后注入它。
【问题讨论】:
标签: java unit-testing junit interface test-suite