java-如何对带有@InjectMocks注释的类的方法存根?

在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"));
}
上一篇:java-为什么Mockito与InputStreams怪异?


下一篇:java-有什么方法可以模拟pojo,然后在嘲笑中手动设置值?