在某些情况下,EasyMock存根似乎可以代替验证。举一个简单的例子:
A级:
public class A {
private B b;
public A(B b) {
this.b = b;
}
int main(int input) {
return b.timesThree(input + 4);
}
}
B级:
public class B {
int timesThree(int input) {
return input * 3;
}
}
ATest类:
@ExtendWith(MockitoExtension.class)
public class ATest {
@Mock
B b;
@InjectMocks
A a;
@Test
void testMain() {
doReturn(21).when(b).timesThree(7);
int result = a.main(3);
assertEquals(21, result);
verify(b).timesThree(7);
}
}
是否指向verify
呼叫? when
调用已经断言b.timesThree()
的输入参数是7。
答案 0 :(得分:1)
在这种情况下,没有。这取决于您在测试中真正要声明的内容。
在这里,您尝试测试以2值调用main方法时应该发生的事情
timesThree应该以值+4调用
timesThree返回的值应该由您的主函数返回
由于在测试中,以下三行足以断言上述两种情况,因此您无需在此处进行验证。
doReturn(21).when(b).timesThree(7);
int result = a.main(3);
assertEquals(21, result);
找出测试是否足够好的最简单方法是注释掉实现的一部分,并使测试失败(TDD)。只要您的考试不及格就可以了。
Ex:将4更改为5-测试失败,删除输入测试失败
假设您的timesThree方法未返回值,而是将其存储在某个地方
int main(int input) {
//Stores value somwhere
b.timesThree(input + 4);
}
在这里,您必须确定断言timesThree的值是7。 在这种情况下,您需要进行验证,因为如果没有验证,您将永远无法通过失败的测试。
还附带一提,注释中有一个提到“如果将代码替换为return 21,则测试将通过;”
要对此进行证明,请考虑使用随机整数而不是硬编码值。这将确保您的实现中没有意外的硬编码。 随机整数的示例库 https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/math/RandomUtils.html#nextInt()