我是Mockito的新手。 我有个问题。 我正在尝试模拟一个类,并使用一个哈希表调用该类的方法,该哈希表返回修改后的相同哈希表。 但是我看到没有调用模拟方法。如果我确实确认我收到的消息是“想要但未调用,实际上,此模拟的交互为零”。
这是我的代码 要测试的课程
public class ClassA{
private ClassB bb = new ClassB();
public boolean init() {
bb= new ClassB();
bb.init();
return true;
}
public void methodToTest(){
Map<String, Map<String, Integer>> hashmap= new LinkedHashMap<>();
hashmap = bb.method1(hashmap);
}
public ClassB getBB() {
return bb;
}
public void setBB(ClassB bb) {
this.bb= bb;
}
}
我的测试班
@RunWith(PowerMockRunner.class)
public class TestClassA {
@Test
@PrepareForTest({Utilities.class, Logger.class, LoggerFactory.class})
public void getData() throws JsonProcessingException, JSONException {
Map<String, Map<String, Integer>> hashmap= new LinkedHashMap<>();
Map<String, Map<String, Integer>> newHashmap= new LinkedHashMap<>();
ClassA class2Test= new ClassA ();
ClassB mockClassB= Mockito.mock(ClassB.class);
PowerMockito.whenNew(ClassB.class).withAnyArguments().thenReturn(mockClassB);
Mockito.when(mockClassB.method1(hashmap)).thenReturn(newHashmap);
Mockito.verify(mockClassB).method1(hashmap);
class2Test.methodToTest();
}
}
答案 0 :(得分:0)
我想你把一些东西混在一起了。
使用重构版本,您需要将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);
}