java - 如何 stub 用@InjectMocks 注释的类的方法?

标签 java unit-testing junit mockito

下面的MyDictionary.get 方法通过调用map.get 使用注入(inject)的map

出于好奇,我对 MyDictionary.get 方法进行了 stub,就像我对 mocks 和 spies 所做的那样,所以我覆盖了注入(inject)。

但这仅在 MyDictionary.get 确实调用了 map.get 时有效。如果 map.get 返回一些字符串(此处为空字符串), stub 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 "";
        }
    }
}

最佳答案

我真的很惊讶你没有得到一个 MissingMethodInvocationException 当你试图 stub 一个不是 @Mock 或 @Spy 的对象的方法时抛出。

dictionary 实例只是一个类的常规实例,这里没有被 Mockito 代理(因为事实上只使用了@InjectMocks 注释)。

另一个令人惊讶的是,当 map.get 被触发时,您不会得到 null,因为 String 返回方法的默认返回值为 null.

无论如何..

如果你想 stub “字典”实例的方法,你必须按如下方式配置你的测试类:

@InjectMocks
@Spy
MyDictionary dictionary;

@Test
public void testMyDictionary(){
    doReturn("value").when(dictionary).get("key);
    Assert.assertEquals("value", dictionary.get("key"));
}

关于java - 如何 stub 用@InjectMocks 注释的类的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42560722/

相关文章:

java - 使用 Hibernate 作为提供程序的 JPA 2.0 - 异常 : No Persistence provider for EntityManager

ruby-on-rails - 在 Rails 中测试库/例程(即不是模型或 Controller )的方法

c# - 我该如何设置(最小起订量设置)

java - 如何让 "Migrate to JUnit 5"选项出现在 Intellij IDEA 中?

perl - 使用 TAP::Harness 处理测试,如何在测试退出时打印输出

junit - 此位置不允许使用 @RunWith(PowerMockRunner.class)

java - 如何在 spring-amqp 请求/回复消息中设置回复的内容类型?

java - 不是完全不可变的集合可以声明为 `final` 并视为常量吗?

java - 根据各个字段的长度拆分字符串

unit-testing - Angular 2 - 未调用单元测试 spy