2016-05-25 139 views
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。这就是为什么我通过实现有了一个测试类的方法,所以我可以创建上下文并在之后注入它。

回答

0

白衣JUnit 4中,您可以创建一套这样的:

import org.junit.AfterClass; 
import org.junit.BeforeClass; 
import org.junit.runner.RunWith; 
import org.junit.runners.Suite; 

@RunWith(Suite.class) 
@Suite.SuiteClasses({ 
    TestFeatureLogin.class, 
    TestFeatureLogout.class, 
    TestFeatureNavigate.class, 
    TestFeatureUpdate.class 
}) 

/** 
* 
* This suite will execute TestFeatureLogin,TestFeatureLogout,TestFeatureNavigate and TestFeatureUpdate one after the over. 
* 
* @Before, @After and @Test are no possible of executing in this class. 
* @BeforeClas and @AfterClass are allowed only. 
* 
* */ 
public class FeatureTestSuite { 
    // the class remains empty of test,although it is possible set up a before class and after class annotations. 
    // used only as a holder for the above annotations 

    @BeforeClass 
    static public void beforeClass(){ 
     System.out.println(FeatureTestSuite.class.toString() + " BeforeClass Method"); 
    } 

    @AfterClass 
    static public void AfterClass(){ 
     System.out.println(FeatureTestSuite.class.toString() + " AfterClass Method"); 
    } 
} 

完整的例子可以发现here

你必须有考虑的另一件事情是,@Test是没有一个很好的做法抽象类中的单元测试。如果您想测试您的实现,请创建扩展Abstract类的测试类。

+0

'FeatureTestSuite'如何为所有套件类注入依赖关系? – MiniW

+0

@MiniW另一种选择是使用Junit规则http://stackoverflow.com/a/13489506/1371064和JUnit参数。显然,这取决于你想测试的那种测试。在我的案例中,我总是在其上下文中使用Spring和innject依赖关系。这里有一个示例如何http://stackoverflow.com/a/14946430/1371064 –