java - 正确使用 Mockito.verify

标签 java unit-testing

我是单元测试的新手,我有一个关于 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/

相关文章:

java - 无法获取类路径资源的资源路径

ios - 如何部分模拟外部对象

JavaFX:PannaableCanvas:获取 CenterX/Y

java - H2 数据库模式创建检查

java - for循环改变背景颜色

java - JSP 视频流(使用 Servlet)

unit-testing - 在Session上设置属性时,Grails 2.0:MissingPropertyException

java - 如何使用 org.w3c.dom.Document 将数据发布到 javascript

unit-testing - Rspec : Testing MongoMapper query

java - Java 中 GUI 的 JUnit 测试