1

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

我必须使用模拟对象绕过这条线。

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

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

提前致谢..

4

4 回答 4

3

如果您需要使用 Mockito,您可能会不走运——它不能模拟静态方法,这是您在 SecurityContextHolder 上调用静态方法 getContext() 时需要做的第一件事。

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

于 2013-06-12T19:09:32.467 回答
0

你可以通过使用 Mockito 作为间谍来做到这一点

将静态方法调用包装在另一个方法中

例如

  public User getUser()
 {
    return (User)SecurityContextHolder.getContext().getAuthentication().getPrinciple();
 }

然后为您的被测对象创建一个间谍,您可以模拟 getUser 方法。

http://eclipsesource.com/blogs/2011/10/13/effective-mockito-part-3/

于 2013-08-23T20:55:19.943 回答
0

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

看看这写起来有多烦人?那是因为您尝试测试的代码很糟糕,而不是因为 mockito 缺少一个功能。Mockito 指出了代码异味。

于 2013-06-12T22:19:38.023 回答
0

另一种方法是委托代码,即:

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

到另一个对象,例如:

AuthenticationService

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

希望有帮助。

于 2014-02-24T17:00:09.817 回答