我試圖從java.util.concurrent包中模擬ExecutorService和Executors。無法在單獨的類中獲取Executor的模擬實例
如果我試圖讓對象在同一個類(測試類)中嘲笑對象,我能夠獲得模擬對象。但是,如果我嘗試在另一個類(我想測試的類)中獲取模擬對象,那麼它會從java.util.concurrent返回實際的對象。以下是代碼片段。
我想測試類:
public class MyClass
{
public void myMethod()
{
ExecutorService executorService = Executors.newFixedThreadPool(2, new MyThreadFactory());
for (int count = 0; count < 2; count++)
{
executorService.submit(new Thread());
}
}
}
class MyThreadFactory implements ThreadFactory
{
@Override
public Thread newThread(Runnable r)
{
return null;
}
}
我的測試類是什麼樣子:
@RunWith(PowerMockRunner.class)
@PrepareForTest(Executors.class)
public class MyClassTest
{
@Test
public void testMyMethod()
{
prepareMocks();
//Code to get mocked object (See testMethod below)
}
private void prepareMocks()
{
ExecutorService executorService = PowerMock.createMock(ExecutorService.class);
EasyMock.expect(executorService.submit(EasyMock.anyObject(Runnable.class))).andReturn(null).anyTimes();
PowerMock.mockStatic(Executors.class);
EasyMock.expect(Executors.newFixedThreadPool(EasyMock.anyInt(), EasyMock.anyObject(ThreadFactory.class))).andReturn(executorService).anyTimes();
PowerMock.replay(executorService, Executors.class);
}
}
如果MyClassTest.testMyMethod()是如下,它返回嘲笑oject。
@Test
public void testMyMethod()
{
prepareMocks();
//Following code reurned mocked instance of ExecutorService
ExecutorService executorService = Executors.newFixedThreadPool(2, new MyThreadFactory());
for (int count = 0; count < 2; count++)
{
executorService.submit(new Thread());
}
}
但是如果我更改測試方法來調用myClass.myMethod()返回實際的實例,而不是嘲笑例如在myMethod的()。
@Test
public void testMyMethod()
{
prepareMocks();
/*
* Within myClass.myMethod(), Executors.newFixedThreadPool() returns actual instance of ThreadPoolExecutor
* instead of mocked object
*/
MyClass myClass = new MyClass();
myClass.myMethod();
}
我期待在myClass.myMethod中獲得Executors/ExecutorService的模擬實例。
這是預期的行爲?任何人都可以解釋行爲嗎?我錯過了什麼?
你知道爲什麼它不總是必要的嗎?例如,當嘲笑會議。請考慮以下內容:http://ideone.com/LIl0H7(測試課程)和http://ideone.com/aPuEoL(外部課程)。 – Line