【问题标题】:JMockit - warning when mocking methods that expect CollectionsJMockit - 模拟期望集合的方法时发出警告
【发布时间】:2016-08-27 01:53:05
【问题描述】:

有没有办法让以下模拟工作而没有未经检查的强制转换警告:

new Expectations() {{
        UrlService.addUrls((List<String>)any); result = expectedCandidates; 
}};

UrlService.addUrls() 方法的签名是:

static List<Candidate> addUrls(List<String> urls)

【问题讨论】:

  • 你不能用@SuppressWarnings("unchecked")吗?
  • 显然可以,但这会让我感到难过,而且通常是个坏习惯

标签: java unit-testing junit jmockit


【解决方案1】:

最好的选择是使用T witnAny(T arg) 参数匹配器:

new Expectations() {{
    UrlService.addUrls(withAny(new ArrayList<String>()));
    result = expectedCandidates;
}};

或者,如果您的 IDE 支持,则在本地禁用代码检查。使用 IntelliJ,我可以编写:

new Expectations() {{
    //noinspection unchecked
    UrlService.addUrls((List<String>) any);
    result = expectedCandidates;
}};

... 这真的没问题。代码检查很好,但总有一些特殊情况可以禁用它们。

【讨论】:

  • 好的,这确实使警告消失了,但期望仍然不起作用。 SUT 返回一个空列表,而不是预期的候选者,该列表之前使用一些真实数据进行了初始化。
  • 哦,是的,我忘了包括result = expectedCandidates(或任何想要的结果)。
  • 我自己想出了这部分。我的意思是当 result = expectedCandidates 完好无损时(使用第一种无警告方法时)它返回一个空列表。
  • 如果我编写一个完整的示例测试,它对我来说很好。你能证明一个失败的测试吗?
  • 我写了一个单独的测试,它也对我有用,所以我想这是我一路上没有注意到的其他东西。我最终为此选择了 SuppressWarnings。
【解决方案2】:

试试这个:

new Expectations() {
        {
            UrlService.addUrls(withArgThat(new IsAnything<List<String>>())); result = expectedCandidates;
        }
    };

【讨论】:

  • 好的,这行得通,但为了简单起见,我实际上在问题中放入了一些通用代码,而不是我的真实代码。我用我的真实代码编辑了这个问题,你的修复仍然不起作用。很抱歉给您带来不便。
  • 新的 IsAnything 似乎不是我的编译器可以识别的东西
  • 这是一个 Hamcrest 核心类:org.hamcrest.core.IsAnything
  • 好的,可以,但是很麻烦。如果没有提供更好的解决方案,我会在几个小时内将其标记为已接受。 10x
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多