【问题标题】:Mockito @Spy on fields of the same typeMockito @Spy 在相同类型的字段上
【发布时间】:2021-08-03 12:23:56
【问题描述】:

我有以下单元测试,其中有以下模拟和间谍。

@Spy
private Map<String, String> rulesObjects = new HashMap<>();

@Spy
private Map<String, Map<String, List<String>>> mandatoryFieldObject = new HashMap<>();

@Mock
private configProperties configProperties;

@InjectMocks
private LoaderService loaderService;

@Test
@DisplayName("This test should load the config files in memory")
void initRuleMaps() throws IOException {
    this.loaderService.initRuleMaps();
    assertThat(this.rulesObjects)
            .isNotEmpty()
            .hasSize(3);
}

initRuleMaps的逻辑调用这2个方法;

private void saveRulesInCache() throws IOException {
    rulesObjects.put(EmvcoConstants.LEGACY, dataLegacy);
    rulesObjects.put(EmvcoConstants.LEGACY1, dataLegacy1);
    rulesObjects.put(EmvcoConstants.LEGACY2, dataLegacy2);
}

private void saveMandatoryFieldListInCache() throws IOException {
    for (Map.Entry<String, String> type: this.configProperties.getTypes().entrySet()) {
        Map<String, List<String>> mandatoryRuleFiledMap = getMandatoryRuleFiled(qrType.getKey());
        mandatoryFieldObject.put(type.getValue(), mandatoryRuleFiledMap);
    }

}

在 initRuleMaps 方法中,两个地图上都有一些计算。每个应有 3 个条目。但是正在发生的事情似乎只创建了一个间谍,并且所有计算都只在一个对象上完成。因此,我得到了 6 个条目。

查看每个间谍的参考资料时,它们实际上是相同的。

有没有办法解决这个问题?

谢谢。

【问题讨论】:

  • 不看initRuleMaps的代码就很难判断。
  • @talex 我更新了这个问题。希望对您有所帮助。

标签: java junit mockito junit5


【解决方案1】:

我猜你的问题在于 @InjectMocks 无法区分这两个地图:https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/InjectMocks.html

字段注入;模拟将首先按类型解析(如果单个 无论名称如何,类型匹配注入都会发生),那么,如果 有多个相同类型的属性,通过字段的匹配 名称和模拟名称。

注意 1:如果您有相同类型(或相同擦除)的字段,则为 最好用匹配字段命名所有 @Mock 注释字段, 否则 Mockito 可能会感到困惑并且不会发生注入。

注意 2:如果 @InjectMocks 实例之前没有初始化并且有一个 没有参数的构造函数,那么它会被这个构造函数初始化。

我认为您的问题在于擦除(这两个字段确实具有相同的类型:Map)。

您应该尝试将 Mock/Spy 命名为:@Mock(name = "database"),名称与 @InjectMocks 中的字段相同。

或者,创建一个构造函数并自己做:new LoaderService(rulesObjects, mandatoryFieldObject, configProperties)

【讨论】:

  • 是的,同意。创建了一个新的构造函数。谢谢。只有 mock 的属性名称不是 spy。
猜你喜欢
  • 2015-07-09
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
  • 2019-07-09
  • 2021-01-02
  • 1970-01-01
  • 2010-12-02
  • 2011-08-05
相关资源
最近更新 更多