我需要测试一些依赖于Spring Security的安全相关类。该代码使用了静态的SecurityContextHolder.getContext()
。如何在不设置整个安全上下文的情况下测试调用方法?什么是测试依赖于静态方法的方法的方法?
我们正在使用JUnit 4和Mockito。 Mockito在它的FAQ中是非常明确的,静态方法不受支持。有其他选择吗? Spring Security案例的答案很好,但我正在寻找解决更普遍问题的解决方案。
我需要测试一些依赖于Spring Security的安全相关类。该代码使用了静态的SecurityContextHolder.getContext()
。如何在不设置整个安全上下文的情况下测试调用方法?什么是测试依赖于静态方法的方法的方法?
我们正在使用JUnit 4和Mockito。 Mockito在它的FAQ中是非常明确的,静态方法不受支持。有其他选择吗? Spring Security案例的答案很好,但我正在寻找解决更普遍问题的解决方案。
看看PowerMock它可以让你嘲笑静态方法,构造函数以及做各种其他你通常不能用java做的事情。它与包括mockito在内的大多数嘲讽库集成在一起(例如,看这里http://code.google.com/p/powermock/wiki/MockitoUsage13)。
一般来说,我发现这是一个非常有用的库,在您的测试工具箱中(编码java时)。唯一需要注意的是,由于这个库会播放字节码,因此如果您有其他库可以执行字节码检测/操作,您可能会遇到麻烦,但直到您尝试之后才会知道。
也许重构代码,所以它接受一些接口,而不是getContext()
?尽管如此,您需要将所有工作委托给上下文的impl。
UPDATE:代码看起来像
interface SecurityContext {
void foo();
}
class SpringSecurityContext implements SecurityContext {
public void foo() {
// call spring static method here
}
}
class TestSecurityContext implements SecurityContext {
public void foo() {
// test case logic here
}
}
class SecurityContextClient {
private final SecurityContext context;
public SecurityContextClient(SecurityContext context) {
this.context = context;
}
void useSecurity() {
context.foo();
}
}
这意味着它是Spring Security的一个辅助类,因此这将是获取上下文的类;即使在你的情况下,我也只是把测试问题转移到了另一个类中。也许你可以提供一个具体的例子让你的观点更强大? – 2011-04-18 12:39:44
@Andrew White我已经更新了一个答案,希望能够澄清我的观点。 – 2011-04-18 12:48:00
您可以参考the following issue和注入org.springframework.security.core.context.SecurityContextHolderStrategy
实例,它的功能是可用的,因为春季安全3.0。
不错!比我的更“春天”的答案。 – 2011-04-18 12:51:25
您应该可以简单地在您的setupt代码中调用与模拟的SecurityContext
。 SecurityContextHolder
似乎是一个围绕ThreadLocal
薄包装,所以它应该工作正常。
这个工作完全像我打算的;我只希望我可以更多地投票回答这个问题。 – 2011-04-18 13:37:14