我们有一个测试在 Maven 中执行失败,但在 Eclipse 中成功。
基本上问题是,当使用 Maven Mockito 执行时,无法模拟来自另一个带有 package private 修饰符的 Maven 模块的父类(super class)的方法。
问题
- 为什么会这样?
- 这是一个已知错误吗?如果不是在哪里归档? surefire, mockito ...?
- 如何解决?
我找到了 description of a similar problem ,建议修复使用 surefire-2.7.1 而不是 2.7.0,但我们已经在 2.10 上(并且在 2.16 中也看到了问题)
显然,最简单的解决方案是公开 BaseClass,但我们不能这样做,因为它不在我们的控制之下。
另一种替代方法是覆盖 MockedClass 中的 close,这虽然丑陋但可行。
错误信息是
failsCallingOriginalMethod(ModifierTest) Time elapsed: 0.156 sec <<< ERROR!
java.lang.RuntimeException: must not have called me
相关代码
真正的代码不在默认包中,而是所有代码都在同一个包中;为简洁起见,删除了导入语句。
Maven 模块 1
public class ModifierTest
{
@Test
public void failsCallingOriginalMethod()
{
MockedClass mock = Mockito.mock(MockedClass.class);
doNothing().when(mock).close();
}
}
Maven 模块 2
public class MockedClass extends BaseClass
{
}
class BaseClass
{
public void close()
{
throw new RuntimeException("must not have called me");
}
}
所涉及内容的版本
Maven 版本 3.0.5(由于其他错误无法更改)
Oracle JDK 1.6.0_20(可使用 IBM JDK 1.5 重现)
模拟 1.95
surefire 插件 2.10(可使用 2.16 重现)
最佳答案
你能控制 MockedClass
吗?
如果是这样,你可以考虑在 MockedClass 中添加一个委托(delegate)方法:
public void close() {
super.close();
}
这不能解决问题,但这是一种快速解决方法。
关于java - Mockito 在 Maven 中失败但在 Eclipse 中成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19536598/