Я думаю, что вы смешали несколько вещей вместе.
В реорганизованной версии вам нужно ввести макет для ClassB
в ClassA
(не нужно использовать PowerMockito.whenNew
).
Также обратите внимание, что вызов verifiy
должен быть после вызова метода теста.
@RunWith(PowerMockRunner.class)
public class SampleTest {
static class ClassB {
public Map<String, Map<String, Integer>> method1(Map<String, Map<String, Integer>> hashmap) {
return null;
}
}
static class ClassA {
private ClassB bb = new ClassB();
public void methodToTest() {
Map<String, Map<String, Integer>> hashmap = new LinkedHashMap<>();
hashmap = bb.method1(hashmap);
}
}
@Mock
ClassB bb;
@InjectMocks
ClassA class2Test;
@Test
public void test() throws Exception {
Map<String, Map<String, Integer>> hashmap = new LinkedHashMap<>();
Map<String, Map<String, Integer>> newHashmap = new LinkedHashMap<>();
Mockito.when(bb.method1(hashmap)).thenReturn(newHashmap);
class2Test.methodToTest();
Mockito.verify(bb).method1(hashmap);
}
}
Для вашего старого кода тест будет выглядеть примерно так, но если вы можете использовать версиювыше.
@PrepareForTest
должен содержать класс, в котором следует манипулировать байтовым кодом, в данном случае ClassA
.
@Test
@PrepareForTest(ClassA.class)
public void test() throws Exception {
Map<String, Map<String, Integer>> hashmap = new LinkedHashMap<>();
Map<String, Map<String, Integer>> newHashmap = new LinkedHashMap<>();
ClassB bb = Mockito.mock(ClassB.class);
Mockito.when(bb.method1(hashmap)).thenReturn(newHashmap);
PowerMockito.whenNew(ClassB.class).withAnyArguments().thenReturn(bb);
ClassA class2Test = new ClassA();
class2Test.methodToTest();
Mockito.verify(bb).method1(hashmap);
}