考虑你想要mock一个接口使用Mockito
包含以下方法签名:
public void doThis(Object o);
public void doThis(Object... o)
我需要verify that doThis(Object o)
(而不是其他方法)已被调用一次。
首先,我认为下面的行可以解决问题:
verify(mock, times(1)).doThis(anyObject());
然而,由于这似乎在 Windows 上有效,但在 Linux 上却不起作用,因为在这种环境中,调用另一个doThis
方法是预期的。
这是因为anyObject()
参数似乎与两个方法签名都匹配其中一个的选择方式或多或少是不可预测的。
我该如何强制执行Mockito 始终选择doThis(Object o)
用于验证?
这不是一个模拟问题。
在进一步调查过程中,我意识到实际的方法是在编译时选择的(JLS §15.12.2) https://stackoverflow.com/questions/32471499/why-does-the-compiler-prefer-an-int-overload-to-a-varargs-char-overload-for-a-ch。所以基本上windows和linux之间的类文件是不同的,这导致了不同的mockito行为。
不鼓励使用该接口(请参阅Effective Java, 2nd Edition, Item 42
)。
我将其更改为匹配以下内容:
public void doThis(Object o);
public void doThis(Object firstObj, Object... others)
通过此更改,将始终选择预期的(第一个)方法。
还剩下一件事:
为什么 Windows 上的 java 编译器(eclipse 编译器)产生的输出与 Linux 上的 Oracle JDK javac 不同?
这可能是 ECJ 中的一个错误因为我希望 Java 语言规范在这里非常严格。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)