JMockit 在 while 循环中模拟一个对象

JMockit Mock an object inside while loop

我正在为以下测试 class 方法编写测试。

  public String doSomething(Dependency dep) {
    StringBuilder content = new StringBuilder();
    String response;
    while ((response = dep.get()) != null) {
      content.append(response);
    }
    return content.toString();
  }

下面是我的测试用例。基本上,我希望 Dependency#get() 方法在第一次迭代中为 return "content",在第二次迭代中为 null

  @Test
  void test(@Mocked Dependency dep) {
    new Expectations() {
      {
        dep.get();
        result = "content";
        times = 1;
      }
    };
    Assertions.assertEquals("content", testSubject.doSomething(dep));
  }

然而,这会导致 JMockit 抛出 Unexpected invocation to: Dependency#get() 错误。如果我删除 times 字段,我的测试将永远循环运行。

如何测试此方法?

所以我发现除了 result 参数之外,JMockit 还可以设置一个 returns(args...) 方法,我们可以向该方法传递一系列它将按顺序期望的参数。因此,将测试修改为这对我有用。

  @Test
  void test(@Mocked Dependency dep) {
    new Expectations() {
      {
        dep.get();
        returns("content", null);
        times = 2;   // limiting to mock only twice as only 2 values are provided in returns
      }
    };
    Assertions.assertEquals("content", testSubject.doSomething(dep));
  }