我正在构建一个简单的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
的内容,但我有两个问题 -
什么是“正确”(普遍接受)的测试方法?有没有办法设定对VelocityTemplateEngine()
的期望,所以我们知道render()
被正确调用并且有正确的参数?
或者我应该专注于测试locals
Map
对象,即使我必须在测试期间公开它来访问它?
谢谢!
我赞同汤姆在评论中提到的观点,但如果仍然如此,
你想要遵循这种模式,Powermockito(以及普通的Powermock)也有办法做到这一点。我将在这里发布一个例子
Employee mockEmployeeObject = mock(Employee.class);
PowerMockito.whenNew(Employee.class)
.withAnyArguments().thenReturn(mockEmployeeObject);
verify(mockEmployeeObject, times(1)).someMethod();
Powermockito.whenNew(..)允许我们在创建该类的任何新对象时返回我们的模拟对象,因为您要验证方法参数,它适合您。您可以添加您需要的验证我刚刚发布了一个示例。
希望这可以帮助!
祝好运!