【问题标题】:How to test that an instance method is called with certain arguments?如何测试使用某些参数调用实例方法?
【发布时间】:2018-09-15 13:25:43
【问题描述】:

我正在构建一个简单的 RESTful 应用程序(使用 Spark Java,尽管这个问题更笼统)。

/users索引路由被请求时,会调用下面的Handler。它只是查询所有用户并呈现一个 HTML 模板(使用 Velocity,但同样这个问题更笼统)。

package com.example.api;

import java.util.*;

import spark.Request;
import spark.ModelAndView;
import spark.template.velocity.VelocityTemplateEngine;

public class UsersIndexHandler {

  private Map<String, Object> locals;

  private UserDao userDao;

  public UsersIndexHandler(UserDao userDao) {
    this.locals = new HashMap<>();
    this.userDao = userDao;
  }

  public String execute(Request req, boolean formatAsHtml) {
    // Set locals so they are available in the view
    locals.put("users", userDao.all());

    // Render the view
    String body = new VelocityTemplateEngine().render(new ModelAndView(locals, "views/users/index.vm"))

    return body;
  }
}

我正在尝试为这种情况编写一个基本的Junit 测试。我可以测试返回的String 的内容,但我有两个问题-

  1. 页面的 HTML 可能很长,因此直接将实际结果与预期的测试字符串进行比较是不切实际的

  2. 应在视图测试中测试视图的内容。

什么是“正确”(普遍接受)的测试方法?有没有办法对VelocityTemplateEngine() 设置期望值,这样我们就知道render() 被正确调用并带有正确的参数?

或者我应该只专注于测试 locals Map 对象,即使我必须在测试期间公开它才能访问它?

谢谢!

【问题讨论】:

  • 当您的代码会考虑单一职责原则并将VelocityTemplateEngine 实例传递给构造函数而不是自己创建它时,您会遇到更少的问题。然后你就可以轻松地创建一个 mock。

标签: java junit easymock spark-java


【解决方案1】:

我同意汤姆在评论中提到的观点,但如果仍然如此,

如果你想遵循这种模式,Powermockito(以及普通的 Powermock)有办法做到这一点。我将在这里发布一个示例

Employee mockEmployeeObject = mock(Employee.class);

PowerMockito.whenNew(Employee.class)
            .withAnyArguments().thenReturn(mockEmployeeObject);

verify(mockEmployeeObject, times(1)).someMethod();

Powermockito.whenNew(..) 让我们在创建该类的任何新对象时返回我们的模拟对象,因为您想验证方法参数,它对您很有效。您可以添加您需要的验证,我刚刚发布了一个示例。

希望这会有所帮助!

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 2015-05-12
    • 2018-02-28
    • 1970-01-01
    相关资源
    最近更新 更多