Java 如何为一组方法编写单元测试,其中每个方法都依赖于其他方法?
我是编写单元测试的新手&在为以下场景编写测试用例时遇到了问题:Java 如何为一组方法编写单元测试,其中每个方法都依赖于其他方法?,java,unit-testing,junit4,method-group,Java,Unit Testing,Junit4,Method Group,我是编写单元测试的新手&在为以下场景编写测试用例时遇到了问题: Class A { public B createB(string name); public B getB(string name); public void removeB(B instance); } Class B { public B(string name); } 如果特定名称已经存在的B实例,则方法createB()将返回null。因此,为了测试案例createB
Class A
{
public B createB(string name);
public B getB(string name);
public void removeB(B instance);
}
Class B
{
public B(string name);
}
如果特定名称已经存在的B
实例,则方法createB()
将返回null。因此,为了测试案例createB()
成功完成,我必须调用getB()
检查它是否存在,然后removeB()
删除它:
A a = getInstanceOfA();
public void testCreateB()
{
B b = a.getB("B");
if (b != null)
{
a.removeB(b);
}
assertNotNull(a.createB("B"));
}
这违反了“一个测试用例只能因为一个原因而失败”的规则,如果测试失败,我不知道问题从何而来。测试getB()
方法也是一样的,必须调用createB()
作为启动测试的先决条件。我正在使用JUnit,每次启动测试时,测试用例都会被洗牌。在这种情况下,是否有任何最佳实践来确保测试用例的隔离
请注意,
getInstanceOfA()
方法是从另一个库提供的API调用,获取a
的“干净”实例是不可控的。您需要将程序置于字符串“B”的已知状态,用“B”调用createB方法,并检查结果是否符合预期。然后你再次这样做,以不同的状态和不同的预期结果。像这样:
public void testCreateBSucess() {
A a = getInstanceOfA(); // Make sure "B" doesn't exists
B b = a.createB("B");
assertNotNull(b);
}
public void testCreateBFail() {
A a = getInstanceOfA();
a.createB("B"); // Making sure "B" exists
B b = a.createB("B");
assertNull(b);
}
看看mockito之类的模拟框架,这将对开发人员控制的其他功能给出一些模拟响应,您可以只测试所需的功能。
- 尝试在方法中使用JUnit4注释,如
和@Before
@After
- 或者只是编写一个复杂的长测试。在很多情况下,如果不违反测试编写的一般规则,就无法编写测试。如果你真的需要,可以写一个很长的测试