在Expectations块中模拟私有方法会导致" IllegalStateException:此时缺少对模拟类型的调用"

时间:2016-08-16 22:15:08

标签: jmockit

我有一个使用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及更高版本中失败了。

1 个答案:

答案 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();
}