JMockit java.lang.IllegalStateException 的 JUnit 测试用例失败:用于记录期望的上下文无效

Posted

技术标签:

【中文标题】JMockit java.lang.IllegalStateException 的 JUnit 测试用例失败:用于记录期望的上下文无效【英文标题】:JUnit test case failure with JMockit java.lang.IllegalStateException: Invalid context for the recording of expectations 【发布时间】:2014-12-18 00:22:35 【问题描述】:
@Test
public void testGetOnlyNewPartitions() throws Exception 
    setUp();
    new Expectations()
        HiveUtil hiveUtil;
        
            HiveUtil.getInstance(); returns(hiveUtil);
            hiveUtil.getAllpartitions(oldTable); returns(oldPartitions);
            hiveUtil.getAllpartitions(newTable); returns(newPartitions);
        
    ;
    PartitionFilter partitionFilter = new PartitionFilter(oldTable, newTable, HiveUtil.getInstance());

我正在对 PartitionFilter 类进行单元测试,该类使用单例类 HiveUtil。

我的测试用例在运行时失败并出现错误“java.lang.IllegalStateException:用于记录期望的无效上下文”。关于为什么会发生这种情况的任何解释?

这是我的 pom.xml 的相关部分:

<dependency>
         <groupId>org.jmockit</groupId>
         <artifactId>jmockit</artifactId>
         <version>1.13</version>
</dependency>

<dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
</dependency>

我试图将 jmockit 依赖项放在 pom 中的 junit 依赖项之前。那没用。

更多研究表明我没有在课程开始时使用@RunWith(JMockit.class) 注释。 但是,当我尝试使用它时,出现错误“无法将类解析为类型”。我做了所有相关的导入。

import static org.junit.Assert.assertEquals;

import org.junit.Test;
import org.junit.runner.*;

import mockit.*;
import mockit.integration.junit4.*;
import junit.framework.TestCase;

我做错了什么?

【问题讨论】:

这个导入想要做什么?导入静态 mockit.Mockit.*;我在 JMockIt API 的 mockit 包中没有看到 Mockit 类 我的错。这是我正在尝试的建议。删除了。 哪一行给你的类不能被解析为一个类型?你在eclipse中看到maven库下的依赖了吗? 您编写测试用例的方式也有点奇怪。回报有什么用?他们的关键字result用于标记一个返回值,new NonStrictExpectations() d.toString();结果 = "模拟日期"; ; 我从这个链接阅读了它的使用后使用了返回:jmockit.googlecode.com/svn-history/r224/trunk/www/tutorial/… 并且类无法解析为在@RunWith(JMockit.class) 行中接收到的类型 【参考方案1】:

最新版本的 JMockit(自 1.7 版起)需要使用模拟注释来引入模拟类型/实例。此外,不再支持 local 模拟字段。所以,测试应该写成这样:

@Test
public void getOnlyNewPartitions(@Mocked final HiveUtil hiveUtil) throws Exception 
    setUp();

    new Expectations() 
        hiveUtil.getAllpartitions(oldTable); result = oldPartitions;
        hiveUtil.getAllpartitions(newTable); result = newPartitions;
    ;

    PartitionFilter partitionFilter = 
        new PartitionFilter(oldTable, newTable, HiveUtil.getInstance());

【讨论】:

这行得通。但我在控制台中收到以下消息:“警告:JMockit 已按需初始化,这可能会导致某些测试失败;请查看文档以了解更好的初始化方法。”

以上是关于JMockit java.lang.IllegalStateException 的 JUnit 测试用例失败:用于记录期望的上下文无效的主要内容,如果未能解决你的问题,请参考以下文章

原创如何使用Jmockit进行单元测试

JMockit - 期望 - 匹配包含模拟对象作为参数的方法调用

JMockit 基础:模拟对象、模拟参数、期望

JMockit - 期望和静态方法

Eclipse 避免 jmockit 的换行

Jmockit 期望错误