我们在Maven中执行测试失败,但在Eclipse中成功。
基本上问题是,当使用Maven Mockito执行时,无法使用包私有修饰符来模拟来自另一个maven模块的超类的方法。
问题
我找到了一个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重现)
Mockito 1.95
surefire插件2.10(可重复使用2.16)
答案 0 :(得分:1)
您是否可以控制MockedClass
?
如果是这样,你可以考虑在MockedClass中添加一个委托方法:
public void close() {
super.close();
}
这不能解决问题,但这是一个快速的解决方法。