我有一个使用JMockit Expectations
块的JUnit测试:
@Tested
private MyTestedClass myTestedClass;
@Injectable
private MyOtherClass myOtherClass;
@Test
public void publicBooleanMethodTest() {
new Expectations() {{
invoke(myOtherClass, "privateMethod");
result = true;
}};
myTestedClass.run(); // Calls myOtherClass.privateMethod();
}
但是,这会导致以下错误:
java.lang.IllegalStateException:此时缺少对mocked类型的调用;请确保仅在声明合适的模拟字段或参数
之后才会出现此类调用
正如您所看到的,myClass
是通过@Injectable
进行模拟的,因此我不确定错误发生的原因。我还发现,如果我将privateMethod()
的范围更改为公开,一切正常。
发生了什么事,我该如何解决这个问题?它在JMockit 1.22中运行良好,但现在在JMockit 1.23及更高版本中失败了。
答案 0 :(得分:2)
JMockit 1.23删除了对Expectations
块中模拟私有方法的支持。来自release notes:
版本1。23(2016年4月24日):
- 删除支持在使用Expectations API时模拟私有方法/构造函数,以防止滥用。如果仍然需要,可以使用
进行模拟或删除MockUp<T>
。
不幸的是,错误的错误消息目前被视为“代价太高”by the development team。由于此讨论,JMockit 1.28中添加了更好的错误消息。
错误日志表示使用MockUp<T>
作为替代方案。在这种情况下,代码如下:
@Tested
private MyTestedClass myTestedClass;
@Injectable
private MyOtherClass myOtherClass;
@Test
public void publicBooleanMethodTest() {
// Partially mock myOtherClass
new MockUp<MyOtherClass>(myOtherClass) {
@Mock boolean privateBooleanMethod() {
return true;
}
};
myTestedClass.run(); // Calls myOtherClass.privateMethod();
}