2011-04-18 107 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薄包裝,所以它應該工作正常。

相關問題