嗨,我在Mokito上挣扎了很多,在对堆栈溢出和其他来源进行了一些搜索后,我仍然无法获得这一点。假设我有一个B类,它看起来像这样:
public class B {
    private String name;
    public String getName(){
        return this.name;
    }
    public void test(){
        String name = getName();
        if (name.equals("S")){
            methodToCall();
        }
    }
    public void methodToCall(){};
}我的目标是测试methodToCall是否在名称等于"S“时被调用,否则不被调用。我尝试的是编写另一个类A,它有一个方法来获取类B的一个实例,如下所示:
public class A {
    public void publish(B classb){
        classb.test();
    }
}然后我有一个像这样定义的测试类:
public class Test {
    public static void main(String[] args) {
        A a = new A();
        B classb = mock(B.class);
        when(classb.getName()).thenReturn("S");
        a.publish(classb);
        verify(classb, times(1)).methodToCall();
    }
}我的理解是,当模拟对象遇到方法getName时,它将返回我放在when方法中的字符串"S“,然后它应该输入if语句并执行这个methodToCall,但集成开发环境给出了这个错误:
Exception in thread "main" Wanted but not invoked:
b.methodToCall();
-> at Test.main(Test.java:12)
However, there were other interactions with this mock:
b.test();
-> at A.publish(A.java:3)
    at Test.main(Test.java:12)我真的很想了解这里发生了什么,我将感谢任何人的帮助。我知道我在这里有一定程度的误解,但如果有人能告诉我这个错误消息到底是什么意思,为什么会出现,以及如何修复它,我将非常感激。(注意,我对注解还不是很熟悉,所以一切都是以原始的方式完成的)
发布于 2020-10-30 08:43:02
当你嘲笑B类的时候,你就嘲笑了所有的类。这意味着你永远不会真正运行" test“函数,而是运行test的一个模拟函数,它什么也不做,因为当你运行这个函数时,你没有告诉mock做什么……
如果您想让模拟程序通过调用when(classb.test()).thenCallRealMethod();来执行真正的方法,但我不推荐这样做。相反,我建议你在使用mockito时阅读下面的this question,并问问自己你想测试什么类。
作为一个经验法则,我只想说,如果你想测试类B中的方法,你不应该模拟类B。Mockito应该模拟类依赖关系,以帮助你只专注于测试目标类(unitest),而不依赖于其他类的行为方式。
https://stackoverflow.com/questions/64601047
复制相似问题