0
我有一个接口定义了一个合同(即一个Repository
),但很少有实现。界面中的每个方法都代表一个功能,我想在它的套件测试类中测试每个功能。JUnit套件合同测试
让我们假设一个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,但我的一些存储库在创建时需要一些逻辑(例如,SQL实现的ConnectionPool
)。我目前使用反模式ServiceLocator
与不同的Context
类来处理创建,但这是static
。这就是为什么我通过实现有了一个测试类的方法,所以我可以创建上下文并在之后注入它。
'FeatureTestSuite'如何为所有套件类注入依赖关系? – MiniW
@MiniW另一种选择是使用Junit规则http://stackoverflow.com/a/13489506/1371064和JUnit参数。显然,这取决于你想测试的那种测试。在我的案例中,我总是在其上下文中使用Spring和innject依赖关系。这里有一个示例如何http://stackoverflow.com/a/14946430/1371064 –