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

2022-09-01 00:09:40

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

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
    }
}

并且基于该值,一些数据将作,从数据库中检索。对于此数据库,值通过 JSON 文件持久保存。dateTime

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


答案 1

不能模拟局部变量。但是,您可以做的是将其创建提取到一个方法中,然后它:protectedspy

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
}

答案 2

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

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


推荐