当前位置: 首页 > 面试题库 >

无法将模拟对象传递给类的实例时如何使用Mockito

许嘉珍
2023-03-14
问题内容

假设我有一个这样的课:

public class MyClass {

    Dao dao;

    public String myMethod(Dao d) {

        dao = d;

        String result = dao.query();

        return result;
    } 
}

我想用模拟测试。因此,我创建了一个模拟对象,然后以这种方式调用方法进行测试:

Dao mock = Mockito.mock(Dao.class);

Mockito.when(mock.myMethod()).thenReturn("ok");

new MyClass().myMethod(mock);

但是,假设我有一个类似的类:

public class MyClass {

    Dao dao = new Dao();

    public String myMethod() {

        String result = dao.query();

        return result;
    } 
}

现在我无法将模拟作为参数传递,那么我该如何测试我的方法呢?有人可以举个例子吗?


问题答案:

从根本上讲,您正在尝试用替代实现替换私有字段,这意味着您违反了封装。您唯一的其他选择是重组类或方法,以使其更好地设计用于测试。

评论中有很多简短的答案,因此我在这里将它们汇总(并添加了我自己的一些观点)作为Community Wiki。如果您有其他选择,请随时在此处添加。

重组班级
为有问题的字段创建设置器,或放宽该字段的可见性。

创建采用DAO的依赖项注入重写或静态方法,并使公共实例方法委托给它。而是测试更灵活的方法。

public String myMethod() { return myMethod(dao); }
String myMethod(Dao dao) { /* real implementation here */ }
  • 添加构造函数重载或静态工厂方法以替换私有字段以进行测试。

  • 完全构造用于依赖项注入的类。(索蒂里奥斯扎Delimanolis,EJK)

请注意,如果将测试放在相同的Java包中(可能在单独的源代码树中),则其中某些测试包可能是私有的。在任何情况下,好名字和文档都有助于使您的意图清晰明了。



 类似资料:
  • 问题内容: 我正在使用Jest和Enzyme来测试React复选框组件。 这是我的测试: 但是在运行测试时出现此错误: 这是我的组件的输入: 我 想 那我需要通过一个事件作为第二个对象,但我不知道如何做到这一点。 谢谢 问题答案: 函数采用其他参数,这些参数将传递给事件处理程序。您可以嘲笑事件。例如:

  • 我在示例中看到如何将消息字符串传递给亚马逊 sns sdk 的发布方法。但是,是否有如何将自定义对象作为消息传递的示例?我尝试将“消息结构”设置为“json”,但随后我得到错误。我应该将对象值传递到参数中的哪个位置? 有什么例子吗?

  • 问题内容: 我正在尝试测试服务类,该服务类在内部使用Spring AMQP连接对象。这个连接对象是由Spring注入的。但是,我不希望单元测试实际上与AMQP代理进行通信,因此我正在使用Mockito注入连接对象的模拟。 希望此代码示例中的注释清楚地提出问题。当Mockito将模拟依赖项注入到真实类中,并且在真实类上进行单元测试导致它调用该模拟对象时,您以后如何才能检索传递给注入的模拟对象的确切参

  • 我试图测试一个服务类,它在内部使用Spring AMQP连接对象。此连接对象由Spring注入。然而,我不希望我的单元测试实际与AMQP代理通信,所以我使用Mockito注入连接对象的mock。 希望这段代码示例中的注释清楚地阐述了这个问题。当Mockito将模拟依赖项注入到真实类中,并且对真实类的单元测试导致它调用模拟时,您以后如何检索传递给注入的模拟的确切参数?

  • 问题内容: 我是新来提升python的人。我必须先在cpp代码中初始化一个cpp类实例,然后将此cpp实例传递给python代码,然后使用python类实例来调用它(cpp实例)。我已经尝试了Python / C API的方式,但是失败了,所以我想知道如何将c ++类实例传递给python类。 以下是我的代码,从boost python演示更改了。 在main.cpp中 在python.py中 在

  • 问题内容: 我有两节课。和。 我有一个要在中使用的功能。我当时正在考虑将的引用传递给的构造函数,然后再调用该函数。 那行得通吗?有人可以给我举个例子吗? 提前致谢! 问题答案: 是的,它将起作用。这是一种不错的方法。您只需传递A类的 实例 : 然后您可以拥有: