我在我的JUnit测试中使用Mockito。测试是一个集成测试,测试整个场景,因此有很多断言和verify(mock)
s。mockito“verify”检查当前状态,但不重置模拟调用
我的问题是,我正在写一些生产代码,做一些断言,然后验证它的工作模式,直到出现相同的模拟调用。看简化代码:
interface I {
void m1();
void m2();
}
// some decorator
class T implements I {
public T(I decorated) {
/*...*/
}
/* ... */
}
public void testInvalid() {
I m = mock(I.class);
T t = new T(m);
t.m1();
assertEquals("m1", t.getLastMethod());
verify(m).m1();
t.m2();
assertEquals("m2", t.getLastMethod());
verify(m).m2();
t.m1();
assertEquals("m1", t.getLastMethod());
verify(m).m1();
// TooManyActualInvocations t.m1(): Wanted 1 time, but was 2 times ...
}
public void testValid() {
I m = mock(I.class);
T t = new T(m);
t.m1();
assertEquals("m1", t.getLastMethod());
t.m2();
assertEquals("m2", t.getLastMethod());
t.m1();
assertEquals("m1", t.getLastMethod());
verify(m, times(2)).m1();
verify(m).m2();
}
一个想法是在年底来验证嘲笑,但让我们说有一个小愚蠢的执行失误导致调用方法M1两次和M2一次,但不是我所期望的它在testInvalid
但最终测试会通过。我希望我的测试早日失败。我如何实现这一目标?
谢谢。
感谢@Woozy编码器:
没有提到的是,reset
也将是一种选择,但既然已经验证,下一个平等的存根调用之间被调用,这使得它很难写“很好“和正确的测试,我想。应该有两种不同的嘲弄风格:
- “后置”嘲讽为的Mockito做它
- “早”嘲讽这将是一个校验块
像后隐式复位:
earlyReset(m).after(
new Runnable() {
t.someMethodInvokingTwoStubs();
verify(m).someMethod1();
verify(m).someMethod2();
}
);
试用一下这个【答案】(http://programmers.stackexchange.com/questions/188299/is-this-an-appropriate-use-of-mockitos-reset-method) – kazbeel
不要测试一种测试方法中的多种方法。一个测试应该有一件东西,它测试,最好是一件可能失败的东西。测试多种方法会使测试更加复杂。将测试分为多个测试方法将解决该问题。 –
@WoozyCoder谢谢,编辑我的文章 – Aitch