скажем, у меня есть класс со следующим конструктором:Как издеваются набор свойств в конструкторе
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());
}
Однако это не работает. Моккито говорит, что никакого взаимодействия с моими издевательскими Исполнителями не было. Поскольку @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 («Имя», NUM), @InjectMocks автоматически создает экземпляр – kuhajeyan
Если я этого не сделаю, Mockito будет жаловаться, что MyImpl не имеет конструктора по умолчанию. Обратите внимание, что 'FooClass foo' не передается в качестве параметра конструктору – user3083022
какое-то объяснение относительно того, как было бы очень полезно – user3083022