Надеюсь, что фрагментов кода примера достаточно, чтобы перестроить мою проблему.mock constructor and super injected field with PowerMockito
У меня есть класс TreeWalker
и подкласс ABCTreeWalker extends TreeWalker
. Я работаю с впрыском пружинной зависимости и в TreeWalker
У меня есть зависимость Helper helper;
, которая защищена и, следовательно, также доступна в ABCTreeWalker
. Все зависимости, такие как helper
, вводятся в поле с пружинами @Autowired
, поэтому нет сеттера.
public class TreeWalker {
@Autowired
protected Helper helper;
}
public class ABCTreeWalker extends TreeWalker {
@Override
public void doSomething() {
String something = helper.getSomething();
InstanceModel instanceModel = new InstanceModel(something);
// ... more stuff ...
}
}
Мне нужно создать модульного тестирования для ABCTreeWalker
класса, в котором мне нужно сделать две вещи:
- впрыснуть издеваться из
helper
в мойABCTreeWalker
класс под тест - высмеивать вызов конструктора
Мой тест работает с @RunWith(PowerMockRunner.class)
, что позволяет вводить helper
с @InjectMocks
и @Mock
Аннотации. НО: Чтобы подготовиться к конструкторскому макету, мне нужно подготовить класс под тестом, который равен ABCTreeWalker
с аннотацией @PrepareForTest(ABCTreeWalker.class)
. И если я это сделаю, инъекция больше не случится (я думаю, потому что это произошло из суперкласса).
@RunWith(PowerMockRunner.class)
@PrepareForTest(ABCTreeWalker.class)
public class ABCTreeWalkerTest {
@InjectMocks
private ABCTreeWalker abcTreeWalker;
@Mock
private Helper helper;
@Test
public void testVisitGui() throws Exception {
// ... more stuff ...
when(helper.getSomething()).thenReturn("test");
InstanceModel instanceModel = mock(InstanceModel.class);
PowerMockito.whenNew(InstanceModel.class)
.withArguments("test")
.thenReturn(instanceModel);
// ... more stuff ...
abcTreeWalker.doSomething(); // execute
// assertions etc.
}
Так что теперь я могу сделать?
- Я мог бы привнести
helper
в моихABCTreeWalker
, но это является излишним - я, вероятно, мог бы создать сеттер, но это только для теста
- я не могу rmeove Powermock из конструктора насмешливого
У вас есть предложения?
Что вы получаете без @PrepareForTest (ABCTreeWalker.class) – Guna
Тогда инъекция работает, но я больше не могу издеваться над вызовом конструктора. – BAER