gpt4 book ai didi

java - 使用套件进行 JUnit 契约(Contract)测试

转载 作者:太空宇宙 更新时间:2023-11-04 12:34:51 24 4
gpt4 key购买 nike

我有一个定义合约的接口(interface)(即存储库),但实现很少。接口(interface)中的每个方法代表一个功能,我想在其套件测试类中测试每个功能。

让我们假设一个 UserRepository 接口(interface)如下:

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();
}
}

我想找到一种方法将这个抽象测试类划分为一组小测试,因为测试类很快就会不堪重负。我查看了测试套件,但我不明白如何通过注入(inject)不同的实现来创建套件测试类。

另一方面,我发现了这个question ,但我的一些存储库在创建时需要一些逻辑(例如,用于 SQL 实现的 ConnectionPool)。我目前使用反模式 ServiceLocator 和不同的 Context 类来处理创建,但这是静态。这就是为什么我采用了通过实现来测试类的方法,这样我就可以创建上下文并随后注入(inject)它。

最佳答案

Whit 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 不是抽象类中单元测试的良好实践。如果您想测试您的实现,请创建扩展抽象类的测试类。

关于java - 使用套件进行 JUnit 契约(Contract)测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37441827/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com