2011-04-18 87 views
7

我需要测试一些依赖于Spring Security的安全相关类。该代码使用了静态的SecurityContextHolder.getContext()。如何在不设置整个安全上下文的情况下测试调用方法?什么是测试依赖于静态方法的方法的方法?

我们正在使用JUnit 4和Mockito。 Mockito在它的FAQ中是非常明确的,静态方法不受支持。有其他选择吗? Spring Security案例的答案很好,但我正在寻找解决更普遍问题的解决方案。

回答

7

看看PowerMock它可以让你嘲笑静态方法,构造函数以及做各种其他你通常不能用java做的事情。它与包括mockito在内的大多数嘲讽库集成在一起(例如,看这里http://code.google.com/p/powermock/wiki/MockitoUsage13)。

一般来说,我发现这是一个非常有用的库,在您的测试工具箱中(编码java时)。唯一需要注意的是,由于这个库会播放字节码,因此如果您有其他库可以执行字节码检测/操作,您可能会遇到麻烦,但直到您尝试之后才会知道。

+0

这个工作完全像我打算的;我只希望我可以更多地投票回答这个问题。 – 2011-04-18 13:37:14

1

也许重构代码,所以它接受一些接口,而不是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(); 
    } 
} 
+0

这意味着它是Spring Security的一个辅助类,因此这将是获取上下文的类;即使在你的情况下,我也只是把测试问题转移到了另一个类中。也许你可以提供一个具体的例子让你的观点更强大? – 2011-04-18 12:39:44

+0

@Andrew White我已经更新了一个答案,希望能够澄清我的观点。 – 2011-04-18 12:48:00

5

您可以参考the following issue和注入org.springframework.security.core.context.SecurityContextHolderStrategy实例,它的功能是可用的,因为春季安全3.0。

+0

不错!比我的更“春天”的答案。 – 2011-04-18 12:51:25

2

您应该可以简单地在您的setupt代码中调用​​与模拟的SecurityContextSecurityContextHolder似乎是一个围绕ThreadLocal薄包装,所以它应该工作正常。