設置比方說,我有以下構造函數的類:如何嘲笑財產構造
public class MyImpl extends Abstract<Foo> {
@Autowired
private FooClass foo;
private final ThreadPoolExecutor executor;
public MyImpl(String name, int num) {
super(name);
this.executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(num);
}
某處這個類有以下方法:
@Override
public void doThis() {
for (int i = 0; i < num; i++) {
executor.execute(() -> foo.doMethod());
}
executor.shutdown();
super.doThis();
}
現在,我想測試foo.doMethod已被調用4次和,executor.execute(any())
和executor.shutdown()
也被調用了4次。
到目前爲止,我有
@RunWith(PowerMockRunner.class)
@PrepareForTest(Executors.class)
public class MyImplTest {
private static final int NUM = 4;
@Mock
private FooClass foo;
@Mock
private ThreadPoolExecutor executor;
@InjectMocks
private MyImpl imyImpl = new MyImpl("Name", NUM);
@Test
public void shouldCallFourTimes() throws Exception {
PowerMockito.mockStatic(Executors.class);
when(Executors.newFixedThreadPool(NUM)).thenReturn(foo);
myImpl.doThis();
PowerMockito.verifyStatic();
Executors.newFixedThreadPool(NUM);
verify(foo, times(NUM)).doMethod());
}
但是這是行不通的。 Mockito說,我的模擬執行器沒有任何交互。 由於@Autowired依賴不是構造函數的一部分,我需要使用@InjectMocks在該字段中指定構造函數。然而,到了I PowerMockito.mockStatic(Executors.class)
時,MyImpl的構造函數已經通過「真實」Executors.newFixedThreadPool
創建了自己的執行程序。
任何想法如何解決這個問題?
UPDATE: 顯然,這不是什麼大不了的改變設計,我現在有以下幾點:
public class MyImpl extends Abstract<Foo> {
@Autowired
private FooClass foo;
private final ThreadPoolExecutor executor;
public MyImpl(String name, ThreadPoolExecutor executor) {
super(name);
this.executor = executor;
}
測試:
@Mock
private ThreadPoolExecutor executor;
@InjectMocks
private MyImpl imyImpl = new MyImpl("Name", executor);
然而,executor
是抵達時,不知何故空構造函數。
你不應該用「新新對象MyImpl(「Name」,NUM)',@InjectMocks自動實例化一個 – kuhajeyan
如果我不這樣做,Mockito會抱怨MyImpl沒有默認構造函數。請注意,'FooClass foo'不會作爲參數傳遞給構造函數 – user3083022
關於如何將大大appreaciated – user3083022