在MyDictionary.get方法下面,通过调用map.get使用注入的地图.
出于好奇,我像往常一样对MyDictionary.get方法进行了打桩,因此我覆盖了注入.
但这仅在MyDictionary.get确实调用map.get时有效.如果map.get返回某个字符串(此处为空字符串),则存根Mockito.when不起作用.该行为就好像它不存在一样.在断言行中,dictionary.get(“ key”)等于空字符串.这是我不明白的.
@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {
@Mock
Map<String, String>map;
@InjectMocks
MyDictionary dictionary;
@Test
public void testMyDictionary(){
Mockito.when(dictionary.get("key")).thenReturn("value");
Assert.assertEquals("value", dictionary.get("key"));
}
private static class MyDictionary{
private Map<String, String> map;
public String get(String key){
return map.get(key);
// or,
return "";
}
}
}
解决方法:
当您尝试对不属于@Mock或@Spy的对象的方法进行存根时,不会引发MissingMethodInvocationException,这让我感到非常惊讶.
字典实例只是Mockito代理的类的常规实例(因为仅使用@InjectMocks注释).
另一个令人惊讶的是,当Map.get作为String返回方法的默认返回值为null触发时,您不会获得null.
无论如何..
如果要对“字典”实例的方法进行存根,则必须按以下方式配置测试类:
@InjectMocks
@Spy
MyDictionary dictionary;
@Test
public void testMyDictionary(){
doReturn("value").when(dictionary).get("key);
Assert.assertEquals("value", dictionary.get("key"));
}