有哪些方法可以测试依赖于静态方法的方法?
我需要测试一些依赖于Spring Security的安全相关类。 此代码使用静态的SecurityContextHolder.getContext()
。 如何在不设置整个安全上下文的情况下测试调用方法?
我们正在使用JUnit 4和Mockito。 Mockito在常见问题解答中非常清楚,静态方法不受支持。 还有其他选择吗? Spring Security案例的答案很好,但我正在寻找更普遍问题的解决方案。
看看PowerMock ,它将允许你模拟静态方法,构造函数,并做各种其他你通常无法用java做的疯狂事情。 它集成了大多数模拟库,包括mockito(例如,请查看http://code.google.com/p/powermock/wiki/MockitoUsage13 )。
一般来说,我发现这是一个非常有用的库,在你的测试工具箱中(编码java时)。 唯一需要注意的是,由于这个库会使用你的字节码,如果你有其他的库进行字节码检测/操作,你可能会遇到麻烦,但是在你尝试之前你不会知道。
您可以参考以下问题并注入org.springframework.security.core.context.SecurityContextHolderStrategy
实例,该实例自Spring Security 3.0起可用。
您应该能够在setupt代码中使用模拟的SecurityContext
简单地调用SecurityContextHolder.setContext()
。 SecurityContextHolder
似乎是一个围绕ThreadLocal
的瘦包装器,因此它应该可以正常工作。
也许重构代码所以它接受一些接口而不是getContext()
? 但是,您需要将所有工作委托给上下文的impl。
更新:代码看起来像
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(); } }