【问题标题】:HashMap doesn't add values after @InjectMocks. The hashmap is inside class with the annotationHashMap 在@InjectMocks 之后不添加值。哈希图在带有注释的类内
【发布时间】:2021-08-27 20:32:57
【问题描述】:

问题是我的缓存中没有添加任何内容。我的课要大得多,所以我在这里提供了应该重现问题的最小示例。 假设我有一个字典类,它使用一些 initialService 来返回带有初始值的 hashMap。

public class Dictionary() {
    @Inject
    private InitialService initialService;
    
    private Map<String, String> map;
    
    public Map<String, String> constructMap() {     
        HashMap<String, String> initialMap = initialService.getHashMap("initialKey", "initialValue");
        return initialMap;
    }
    
    public void saveConstructedMap() {
        map = constructMap();
    }
    
    public Map<String, String> getMap() {
        return map;
    }
}

然后我用 mockito 进行测试。所以首先我使用saveConstructedMap() 方法保存地图,然后使用getMap() 获取地图,然后添加值。 我希望值在那里,但地图是空的。 即使我不将其保存为新值,但会添加 getMap() 所以 getMap().put(...)

public class DictionaryTest() {
    @Mock
    private InitialService initialService;
    
    @InjectMocks
    private Dictionary dictionary;
    
    public void test() {
        dictionary.saveConstructedMap();
        HashMap<String, String> myMap = dictionary.getMap();
        myMap.put("key","value");
        assertTrue(myMap.containsKey("key")); //returns false (the entry is not added)
    }
}

据我了解,Mock 只是模拟类,使其内部为空,但 @InjectMocks 注入指定的模拟并创建一个对象,但以正常方式(就像我会使用 Dictionary 的构造函数一样。所以所有方法和字段应该像普通类一样,而不是测试类。我在这里误解了什么吗?) 有谁知道我应该怎么做才能实现我想要的?

当然,我在setUp() 方法中有initMocks(this),它用@Before 注释,

【问题讨论】:

    标签: java dependency-injection mockito java-ee-6 java-ee-5


    【解决方案1】:

    其实DictionaryTest是不能编译的,例如因为HashMap&lt;String, String&gt; myMap = dictionary.getMap(); 行(应该是Map&lt;String, String&gt;)。可能你只是为了这个问题而写的。

    尽管如此,模拟测试的主要思想是提供模拟类方法的自定义实现。在这种情况下,您应该为InitialService 模拟的getHashMap 方法执行此操作。示例如下:

    Map<String, String> initialMap = new HashMap<>();
    initialMap.put(initialKey, initialValue);
    Mockito.when(initialService.getHashMap("initialKey", "initialValue")).thenReturn(initialMap);
    

    如果你不这样做,Mockito 将设置默认值作为方法的结果 (in this case, it would be null):

    默认情况下,对于所有返回值的方法,mock 将根据需要返回 null、原始/原始包装器值或空集合。

    另一种方法是创建a partial mock 并在需要时使用其方法的真实实现。但不要利用它。

    【讨论】:

    • 谢谢你的回答,但是我当然忘了在这里添加这段代码(我的项目中有它)。我有当...然后...初始服务,但它仍然不起作用
    • 我想知道是不是因为这个领域?可能无法在带有 @InjectMocks 注释的类中访问字段。
    • 等等,它实际上开始工作了,但是......我不明白......我必须考虑一下
    猜你喜欢
    • 2012-10-21
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多