我需要測試一些依賴於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