我是单元测试的新手,我对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)
?
答案 0 :(得分:3)
我认为你误解了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)
确实调用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");
}