【问题标题】:How do we unit test this lambda expression?我们如何对这个 lambda 表达式进行单元测试?
【发布时间】:2016-07-28 11:19:22
【问题描述】:

我们有一个从浏览器调用的 REST 端点 (JAX-RS)。我们正在传递 OutputStream 以便我们可以让浏览器显示调用的结果。

方法如下。

@Path("/mypath/{userId}")
@POST
public Response createUser(@PathParam("userId") final int userId ) {
    StreamingOutput stream = (outputStream) -> {
        User user = userHelper.findUser(userId);
        userHelper.updateUser(user,outputStream);
    };

    return Response.ok(stream).build();
}

使用 Junit 和 Mockito,我们如何验证 userHelper.findUseruserHelper.updateUser 是否已被调用

基本上我们只是想验证交互。

【问题讨论】:

  • 你必须注入一个 userHelper 的 Mock。您是否已经创建了一个 TestCase?
  • 是的。那是行不通的。没有发生交互,因为它是一个 lambda 表达式。
  • 所以您的测试应该触发交​​互,然后验证模拟

标签: java unit-testing junit mockito


【解决方案1】:

要“单元”测试这个,你应该创建你的测试类并在测试类中创建这个方法所属的类的新实例。 userHelper 没有在 lambda 中定义,所以它是一个类成员?如果是这样,它可以被嘲笑:

  • 使用 Mockito 创建 mock userhelper 对象
  • inject 模拟到您的测试课程。
  • 调用 createUser 方法。
  • verify 在 mock 上断言 updateUser 方法被调用一次。
  • 您可以更进一步,使用captors 验证传递了哪些用户和输出流对象。

【讨论】:

    【解决方案2】:

    只有当另一端的某人(通常是浏览器)开始从中拉取数据时,才会调用 StreamingOutput。您的测试用例需要接管并(如 cmets 建议的那样)开始与响应交互。

    【讨论】:

      猜你喜欢
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      • 2018-04-26
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      相关资源
      最近更新 更多