我是单元测试的新手,我有一个关于 Mockito 中使用的 verify
方法用法的简单问题。这是我用于测试的类(class)。
public class Foo{
int n = 0;
void addFoo(String a){
if(a == "a")
add(1);
}
protected void add(int num){
n =1;
}
public int get(){
return n;
}
这是我的单元测试。
public class FooTest {
@Mock Foo f;
@Test
public void test() {
MockitoAnnotations.initMocks(this);
f.addFoo("a");
//Passes
Mockito.verify(f).addFoo("a");
//Fails
Mockito.verify(f).add(1);
}
我得到一个
Wanted but not invoked:
f.add(1);
-> at FooTest.test(FooTest.java:22)
However, there were other interactions with this mock:
-> at FooTest.test(FooTest.java:16)
异常。
如何验证调用了 add(int num)
?
最佳答案
我认为您误解了 verify
的要点.
在你的测试中,Foo f
是一个模拟对象 - Foo
的内部实现被忽略,只会发生您在其上记录的行为(使用 when(f.someMethod().thenXXX
)。
模拟和验证的重点是在忽略内部实现的同时测试交互。
在此示例中,您可能有另一个类使用 Foo
,并且您想要测试它是否调用给定 Foo
的正确方法实例。
简单示例:
假设您有一个使用 Foo
的类您在问题中提出的类(class):
public class FooUser {
private Foo f;
public void setFoo(Foo f) {
this.f = f;
}
public Foo getFoo() {
return f;
}
public void addToFoo(String string) {
f.add(string);
}
}
现在,您要测试 FooUser#addToFoo(String)
确实调用了正确的 add(String)
Foo
的方法| :
@RunWith (MockitoJUnitRunner.class)
public class FooUserTest {
@Mock Foo f;
FooUser fUser;
@Before
public void init() {
fUser = new FooUser();
fUser.setFoo(f);
}
@Test
public void test() {
fUser.addToFoo("a");
Mockito.verify(f).addFoo("a");
}
关于java - 正确使用 Mockito.verify,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19782926/