当前位置: 首页 > 知识库问答 >
问题:

使用Mockito模拟方法的局部变量

元彦君
2023-03-14

我有一个类a需要测试。以下是A的定义:

public class A {
    public void methodOne(int argument) {
        //some operations
        methodTwo(int argument);
        //some operations
    }

    private void methodTwo(int argument) {
        DateTime dateTime = new DateTime();
        //use dateTime to perform some operations
    }
}

并根据datetime值从数据库中检索一些要操作的数据。对于该数据库,值通过JSON文件持久化。

这使事情复杂化了。我需要的是在测试datetime时将其设置为某个特定的日期。有没有办法可以用mockito模拟局部变量的值?

共有3个答案

范浩荡
2023-03-14

这可能太麻烦了,但是如果您模拟可以给出局部变量的对象,那么您可以返回它的一个模拟。我宁愿不重新构造代码以使测试更容易,但这是需要考虑的。

public class A {
    
    DateTimeFactory factory;

    private void method() {
        DateTime dateTime = factory.getDateTime();
        //use dateTime to perform some operations
    }
}

在测试中,可以执行以下操作:when(factorymock.getDateTime()).doReturn(dateTimeMock)

将需要以某种方式将工厂模拟注入到类中。

谷德本
2023-03-14

处理此类问题的最佳方法是使用注入的clock服务,用于获取DateTime的新实例。这样,您的测试就可以注入一个模拟时钟,它返回一个特定的DateTime而不是当前时间。

注意,新的Java 8time API定义了这样一个时钟类,专门用于此目的。

周宏伯
2023-03-14

不能模拟局部变量。但是,您可以做的是将其创建提取到protected方法中,并将其提取到spy中:

public class A {
  public void methodOne(int argument) {
    //some operations
    methodTwo(int argument);
    //some operations
  }

  private void methodTwo(int argument) {
    DateTime dateTime = createDateTime();
    //use dateTime to perform some operations
  }

  protected DateTime createDateTime() {
    return new DateTime();
  }
}

public class ATest {
  @Test
  public void testMethodOne() {
    DateTime dt = new DateTime (/* some known parameters... */);
    A a = Mockito.spy(new A());
    doReturn(dt).when(a).createDateTime();
    int arg = 0; // Or some meaningful value...
    a.methodOne(arg);
    // assert the result
}
 类似资料:
  • 问题内容: 我有这样的情况 到目前为止我一直在嘲笑 现在我得到一个读者 但是当我执行此行时,我得到null并且无法前进 请告诉我如何嘲笑这个。请注意,我无法更改我的主要代码,因此在我的情况下,Mockito文档中存在的解决方案无效 测试码 问题答案: 要使此工作正常进行,您需要使用Powermockito来拦截构造函数调用(新的InputStreamReader(…),新的BufferedRead

  • 我是莫基托的新手。我试图通过模拟数据库交互为服务编写jnuit: 我有下面的类(只是实际类的代表) 我的测试课就像是 但是当我运行这个测试时,它仍然调用实际的db调用并从DB中检索值,而不是模拟值,我应该模拟sql连接和非默认构造函数吗?我一无所知。 -- 更新 正如人们所建议的那样,我将DAO实例化移动到我的服务构造函数中,并且还使用了Spy,但是我仍然调用了实际的DB调用而不是模拟调用。

  • 使用mockito模拟一个方法会确保永远不会调用被模拟的方法吗?我有一个主类,它包含一些我想为其编写单元测试的代码,还有一个单元测试类MainTest,它包含主类的单元测试。 eg: 源类: JUnit测试(使用mockito) 这项测试失败了。为什么?

  • 我的测试存根是 我在这里做错了什么?

  • 问题内容: 我是开发的新手,尤其是单元测试的新手。我想我的要求很简单,但是我很想知道其他人对此的想法。 假设我有两个这样的类- 假设我正在编写单元测试到测试方法。但是,假设我想像这样模拟课程。我正在使用Mockito来做到这一点。 我看到模拟未生效,并且断言失败。没有办法模拟我要测试的类的成员变量。? 问题答案: 您需要提供一种访问成员变量的方式,以便您可以进行模拟传递(最常见的方式是使用参数的s