【问题标题】:Mockito fails in Maven but succeeds in EclipseMockito 在 Maven 中失败,但在 Eclipse 中成功
【发布时间】:2013-10-23 08:28:01
【问题描述】:

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

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

问题

  1. 为什么会这样?
  2. 这是一个已知的错误吗?如果没有在哪里归档?万无一失,模仿...?
  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

相关代码

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

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 重现)

Mockito 1.95

surefire 插件 2.10(可在 2.16 中重现)

【问题讨论】:

    标签: java eclipse maven mockito surefire


    【解决方案1】:

    你对MockedClass有控制权吗?

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-26
      • 2021-07-05
      • 2011-03-09
      • 2014-03-08
      • 1970-01-01
      • 2011-09-27
      • 2014-04-04
      • 1970-01-01
      相关资源
      最近更新 更多