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

标签 java mocking mockito functional-testing

我有一个需要测试的类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 模拟局部变量的值?

最佳答案

您不能模拟局部变量。但是,您可以做的是将其创建提取到 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
}

关于java - 使用 Mockito 模拟方法的局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23236338/

相关文章:

java - 为了用 Guice 注入(inject)一个类,替换的类必须作为对象参数传递给构造函数?

java - Mockito:要测试的类中的空对象

java - Spring WebFlux 无法在 Tomcat 中运行

java - 如何在服务器启动时从 ServletContext 连接到同一 Tomcat 服务器上的文件

java - 如果 Xms5120m,jvm 会分配 5G RAM

java - 使用 Mockito isEmpty 的模拟列表始终返回 false,即使大小为 0

java - Mockito 参数匹配器和 hibernate 延迟初始化

java - 如何使用 java 创建 .java 文件?

php - Symfony 服务中的模拟邮件程序

unit-testing - 如何在 go 中测试 pubsub 消息确认?