IllegalArgumentException:期望块内的条件语句无效

Posted

技术标签:

【中文标题】IllegalArgumentException:期望块内的条件语句无效【英文标题】:IllegalArgumentException: Invalid conditional statement inside expectation block 【发布时间】:2016-03-17 08:35:11 【问题描述】:

我在测试用例中编写的 Expectations 块有问题:

new Expectations() 
      
        mFindHandlerMock.findAll((Model) any, (Set<Id>) any, false);
        if (!pWithRealData) 
          result = Collections.emptySet();
         else 
          result = pAllData;
        
        times = 1;

        Deencapsulation.invoke(mDb, "readSqlQuery", withAny(String.class));
        result = "select * from realdata";
        times = 1;
      
    ;

测试用例崩溃:

java.lang.IllegalArgumentException: Invalid conditional statement inside expectation block

就在这里:

if (!pWithRealData) 

这只是一个简单的boolean,在这种情况下就是false

我完全不知道为什么会发生exception。 我已经用谷歌搜索过,但没有发现任何有用的东西。

你能帮帮我吗?

【问题讨论】:

你能说明你如何以及在哪里声明和初始化pWithRealData吗? 这是一个简单的布尔值。它只能是 0 或 1,false 或 true 没有初始化。如果我不通过布尔值,我会得到编译错误。我通过假... 你为什么要多放一个打开和关闭花括号??有什么需要吗???它是匿名初始化程序块还是用于任何其他目的?? 大括号是必要的。如果没有大括号,我会得到“令牌上的语法错误,应改为 AnnotationName” 【参考方案1】:

来自 1.14 版的 JMockit 发行说明:

增强功能:条件和循环现在将在期望记录块中发现异常时触发异常,以防止 API 滥用并鼓励更简单的测试。请参阅问题 #97。

与此相关的 GitHub 问题:

https://github.com/jmockit/jmockit1/issues/97 https://github.com/jmockit/jmockit1/issues/123

在一期中,他们声明:

是的,这是为了避免在记录期望时测试变得过于复杂。没有显示完整的测试,但在我看来,在这种情况下直接记录特定的期望会更好。

在 JMockit source 中,您可以查看哪些其他类型的条件和循环会引发该异常。

简而言之,从 JMockit 1.14 开始,您不能在 Expectation 块中使用条件(例如 if 语句)和循环。

【讨论】:

以上是关于IllegalArgumentException:期望块内的条件语句无效的主要内容,如果未能解决你的问题,请参考以下文章

IllegalArgumentException:无效的列纬度

Retrofit-IllegalArgumentException:意外的 url

引起:java.lang.IllegalArgumentException:属性'driverClassName'不能为空

IllegalArgumentException:接收方未注册

IllegalArgumentException 介绍

java.lang.IllegalArgumentException:基本 URI 不能为空