我在为包含以下代码的方法创建 junit 测试用例时遇到问题。
我必须使用模拟对象绕过这条线。
SecurityContextHolder.getContext().getAuthentication().getPrinciple();
请帮我为此方法链创建模拟对象,欢迎提出任何建议/想法。
提前致谢..
我在为包含以下代码的方法创建 junit 测试用例时遇到问题。
我必须使用模拟对象绕过这条线。
SecurityContextHolder.getContext().getAuthentication().getPrinciple();
请帮我为此方法链创建模拟对象,欢迎提出任何建议/想法。
提前致谢..
如果您需要使用 Mockito,您可能会不走运——它不能模拟静态方法,这是您在 SecurityContextHolder 上调用静态方法 getContext() 时需要做的第一件事。
可以模拟第一个调用的替代方法是powermock。如果您可以通过第一个静态方法,模拟链的其余部分可能会涉及模拟每个调用的返回值并手动设置链,例如,创建一个模拟 Authentication 实例以由模拟 SecurityContext 实例返回, 等等。
你可以通过使用 Mockito 作为间谍来做到这一点
将静态方法调用包装在另一个方法中
例如
public User getUser()
{
return (User)SecurityContextHolder.getContext().getAuthentication().getPrinciple();
}
然后为您的被测对象创建一个间谍,您可以模拟 getUser 方法。
见http://eclipsesource.com/blogs/2011/10/13/effective-mockito-part-3/
正如@Brabster 所说,您不能模拟静态方法。如果您仍想使用 mockito,则需要找到一种方法来模拟getContext()
返回的内容。这可以通过修改被测系统给它一个测试模式来完成。当它处于该测试模式时,您可以调用 setter 将返回值设置为 mockito mock。或者,您可以通过向setTestContext(...)
类添加方法来组合这些步骤。
看看这写起来有多烦人?那是因为您尝试测试的代码很糟糕,而不是因为 mockito 缺少一个功能。Mockito 指出了代码异味。
另一种方法是委托代码,即:
SecurityContextHolder.getContext().getAuthentication().getPrinciple()
到另一个对象,例如:
AuthenticationService
然后在您的代码中自动连接服务。然后,您可以在测试中模拟该服务。
希望有帮助。