2014-11-05 71 views
2

我正在使用JMockit 1.12並且想驗證是否調用了AccessController.doPrivileged()。這似乎相當簡單:JMockit/Netbeans - 驗證AccessController.doPrivileged()被調用

@Test(expected = MissingInvocation.class) 
public void testFoo1() { 
    foo(false, true); 
} 

@Test 
public void testFoo2() { 
    foo(false, false); 
} 

@Test 
public void testFoo3() { 
    foo(true, true); 
} 

private void foo(boolean usePrivilegedAccess, boolean expectAccessControllerCall) { 
    new NonStrictExpectations(AccessController.class) {{ 
    }}; 

    if (usePrivilegedAccess) { 
     AccessController.doPrivileged((PrivilegedAction<String>)() -> ""); 
    } 

    // verify AccessController.doPrivileged was called 
    if (expectAccessControllerCall) { 
     new Verifications() {{ AccessController.doPrivileged(withAny((PrivilegedAction<Object>)() -> null)); }}; 
    } 
} 

注意testFoo1()不調用AccessController.doPrivileged()尚未執行檢查反正。

我添加了這個方法,因爲我發現即使AccessController.doPrivileged()有時也會傳遞驗證塊。我正在使用Netbeans 8.0.1,經過很多測試後,我發現如果使用「運行聚焦測試方法」或「調試聚焦測試方法」(僅運行1次測試)來運行測試,則會通過測試。如果我使用「測試文件」(運行所有測試),則testFoo1()失敗,因爲它不會丟失MissingInvocation。如果我使用「調試測試文件」(運行所有測試),那麼如果我放置一個斷點,它總是失敗;它間歇地失敗,如果我不放在一個斷點。很奇怪。

我的JMockit用法是否正確?我是新的,所以任何指針讚賞,但請注意,我想運行2測試完全相同的測試代碼,只有一個布爾標誌不同。我不想複製/粘貼兩次測試。

Netbeans有什麼問題嗎?

這是與管道中的某處CGLib注入有關嗎?

回答

0

可能發生的情況是,在測試期間,AccessController.doPrivileged(...)從其他地方被調用,可能來自NetBeans或更可能來自JRE本身。

JMockit 1.x不會將AccessController類的模擬限制爲foo(boolean,boolean)方法;相反,它向其方法註冊全部調用,而不管它們來自哪裏。測試必須執行更嚴格的驗證,可能會檢查傳遞給模擬方法的確切的PrivilegedAction實例,或者甚至通過檢查調用堆棧來查看其來源。

對於JMockit 2,計劃進行API更改,以便模擬僅限於@Tested類,避免出現類似情況。

相關問題