[英]Proper usage of Mockito.verify
我是单元测试的新手,我对Mockito中使用的verify
方法的使用有一个简单的问题。 这是我用于测试的类。
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
类:
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)
确实调用了Foo
的正确add(String)
方法:
@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");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.