2013-06-12 51 views
1

我在为包含以下代码的方法创建junit测试用例时面临问题。我不得不使用模拟对象绕过这条线。如何使用mockito进行方法链

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

请帮助我为这种方法链创建模拟对象,任何建议/想法是最受欢迎的。

在此先感谢..

回答

0

另一种方式是委托代码即:

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

到另一个对象,例如:

AuthenticationService 

然后自动线在你的代码的服务。你可以在你的测试中嘲笑服务。

希望有所帮助。

3

你可能是出于运气,如果你需要使用的Mockito - it can't mock static methods,这是你需要呼吁static method getContext() on SecurityContextHolder做的第一件事。

另一种可能能够模拟第一个呼叫的方法是powermock。如果可以通过第一个静态方法,嘲笑链的其余部分可能会涉及到嘲笑每个调用的返回值并手动设置链,例如,创建一个模拟的Authentication实例,以便由您的模拟SecurityContext实例返回, 等等。

0

正如@Brabster所说,你不能嘲笑静态方法。如果你仍然想使用mockito,你需要找到一种方法来模拟getContext()返回的结果。这可以通过修改被测系统来给它一个测试模式来完成。当它处于该测试模式时,您可以调用setter将返回值设置为mockito模拟。或者,您可以通过将setTestContext(...)方法添加到课程中来结合这些步骤。

看看这是怎么写的?这是因为你试图测试的代码很糟糕,并不是因为mockito缺少一个功能。 Mockito指出了一种代码味道。

+0

任何人都可以在不更改应用程序代码的情况下建议我使用替代方法 – ManojP

+0

实际上,这看起来像是一种很好的'static'方法。特别是在Web应用程序中,能够轻松地从任何可能需要登录的用户处获得登录用户是非常有用的。 (我过去已经这样做了。)使用ThreadLocal很容易实现,并且比替代方法更容易使用(DI,或者通过方法参数从调用堆栈顶部传递)。至于它很容易嘲笑,这完全取决于正在使用的模拟API。 –