如何使用mockito进行方法链

时间:2013-06-12 18:52:47

标签: mockito method-chaining

在为包含以下代码的方法创建junit测试用例时,我遇到了问题。

我必须使用模拟对象绕过这一行。

SecurityContextHolder.getContext()getAuthentication()getPrinciple();

请帮我为这个方法链创建模拟对象,欢迎任何建议/想法。

提前感谢..

4 个答案:

答案 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

然后在您的代码中自动连接服务。然后,您可以在测试中模拟服务。

希望有所帮助。