微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决JMockit 在 while 循环中模拟一个对象

我有一个下面的测试类方法,我正在为其编写测试。

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

下面是我的测试用例。基本上我希望 Dependency#get() 方法在第一次迭代中返回 "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));
  }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。