java - Mockito 在 Maven 中失败但在 Eclipse 中成功

标签 java eclipse maven mockito surefire

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

基本上问题是,当使用 Maven Mockito 执行时,无法模拟来自另一个带有 package private 修饰符的 Maven 模块的父类(super class)的方法。

问题

  1. 为什么会这样?
  2. 这是一个已知错误吗?如果不是在哪里归档? surefire, mockito ...?
  3. 如何解决?

我找到了 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/

相关文章:

Java:通过我的程序清除 NetBeans 控制台

java - 启动 JVM REST 服务,我应该使用什么堆栈?

eclipse - 设置 play framework 和 dart 以进行开发和调试

java - 将信息读入多个数组

java - 在netbeans中使用maven java应用程序制作可执行jar

java - Android: Fragment TabHost Icons 不能占满空间?

java - 如何打开 GWT Designer 以及打开什么类型的文件?

java - 在 Eclipse 中如何判断哪个 'wizard' 调用了实际的向导类

java - 减少多模块 Maven 项目的 Docker 镜像大小

Java Maven OSGi 从文件系统动态加载 jar 并在运行时从中运行类方法