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