首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >简单的Mokito示例

简单的Mokito示例
EN

Stack Overflow用户
提问于 2020-10-30 08:20:10
回答 1查看 24关注 0票数 0

嗨,我在Mokito上挣扎了很多,在对堆栈溢出和其他来源进行了一些搜索后,我仍然无法获得这一点。假设我有一个B类,它看起来像这样:

代码语言:javascript
运行
复制
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的一个实例,如下所示:

代码语言:javascript
运行
复制
public class A {
    public void publish(B classb){
        classb.test();
    }
}

然后我有一个像这样定义的测试类:

代码语言:javascript
运行
复制
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,但集成开发环境给出了这个错误:

代码语言:javascript
运行
复制
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)

我真的很想了解这里发生了什么,我将感谢任何人的帮助。我知道我在这里有一定程度的误解,但如果有人能告诉我这个错误消息到底是什么意思,为什么会出现,以及如何修复它,我将非常感激。(注意,我对注解还不是很熟悉,所以一切都是以原始的方式完成的)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-30 08:43:02

当你嘲笑B类的时候,你就嘲笑了所有的类。这意味着你永远不会真正运行" test“函数,而是运行test的一个模拟函数,它什么也不做,因为当你运行这个函数时,你没有告诉mock做什么……

如果您想让模拟程序通过调用when(classb.test()).thenCallRealMethod();来执行真正的方法,但我不推荐这样做。相反,我建议你在使用mockito时阅读下面的this question,并问问自己你想测试什么类。

作为一个经验法则,我只想说,如果你想测试类B中的方法,你不应该模拟类B。Mockito应该模拟类依赖关系,以帮助你只专注于测试目标类(unitest),而不依赖于其他类的行为方式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64601047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档