Mockito在Maven中失败了,但在Eclipse中成功了



我们有一个测试,在Maven中执行时失败,但在Eclipse中成功。

基本上问题是,当使用 Maven Mockito 执行时,无法模拟来自另一个带有包私有修饰符的 maven 模块的超类的方法。

问题

  1. 为什么会这样?
  2. 这是一个已知的错误吗?如果不是在哪里提交?万无一失,莫皮托...?
  3. 如何解决?

我发现了类似问题的描述,建议使用surefire-2.7.1而不是2.7.0,但我们已经在2.10上了(也看到了2.16中的问题)

显然,最简单的解决方案是公开 BaseClass,但我们不能这样做,因为它不受我们的控制。

另一种选择是在 MockedClass 中覆盖关闭,这很丑陋,但有可能。

错误消息是

failsCallingOriginalMethod(ModifierTest)  Time elapsed: 0.156 sec  <<< ERROR!
java.lang.RuntimeException: must not have called me

相关代码

实际代码不在默认包中,但所有代码都在同一个包中;为简洁起见,删除了 import 语句。

Maven 模块 1

public class ModifierTest
{
    @Test
    public void failsCallingOriginalMethod()
    {
        MockedClass mock = Mockito.mock(MockedClass.class);
        doNothing().when(mock).close();
    }
}

专家模块 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

万无一失的插件 2.10(可与 2.16 重现)

你能控制MockedClass吗?

如果是这样,你可以考虑在 MockedClass 中添加一个委托方法:

public void close() {
    super.close();
}

这并不能解决问题,但这是一个快速的解决方法。

相关内容

  • 没有找到相关文章

最新更新