首页 > 代码库 > JMockit+JUnit单元测试初始化问题

JMockit+JUnit单元测试初始化问题

一、项目环境:

WIN7 64位,Eclipse 4.2,JDK1.6,JUnit 4.11,JMockit 1.10


二、示例代码:

import static org.junit.Assert.*;

import org.junit.runner.RunWith;

import cn.open.dao.AppDao;
import cn.open.ddl.App;
import cn.open.service.AppService;
import mockit.Expectations;
import mockit.Mocked;
import mockit.integration.junit4.JMockit;

public class Test {

    @Mocked AppDao unused = null;
    
    @org.junit.Test
    public void test() {
        final App app = new App();
        app.id = 22;
        app.adStatus = 1;
        app.appName = "hello";
        
        new Expectations() {
            {
                AppDao.findById(anyInt);
                result = app;
            }
        };
        
        App re = AppService.get(1);
        assertEquals(app, re);
    }
}



使用JUnit + JMockit进行单元测试,运行JUnit Case时,抛出以下错误:

java.lang.IllegalStateException: JMockit wasn‘t properly initialized; check that jmockit.jar precedes junit.jar in the classpath (if using JUnit; if not, check the documentation)
    at cn.uc.appstore.open.Test$1.<init>(Test.java:26)
    at cn.uc.appstore.open.Test.test(Test.java:26)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)


三、解决方法:

1. 添加以下JUnit运行环境参数:

-javaagent:path/to/your/jmockit/jmockit-1.10.jar


2. 配置Maven插件绕过该问题:   

JMockit一定要在JUnit之前:

<!-- JMockit must be before JUnit in the classpath -->
<dependency>
  <groupId>mockit</groupId>
  <artifactId>jmockit</artifactId>
</dependency>
<!-- Standard unit testing --><
dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
</dependency>

确保插件已配置:

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <version>2.4.3</version>
   <configuration>
      <argLine>-javaagent:${settings.localRepository}/mockit/jmockit/0.998/jmockit-0.998.jar</argLine>
      <useSystemClassLoader>true</useSystemClassLoader>
    </configuration>
 </plugin>


3. 使用@RunWith注解

@RunWith(JMockit.class)
public class Test {}


四、结论

解决方法1,3经过测试能够解决上述错误,解决方法2未测试。


五、参考

StackOverflow



JMockit+JUnit单元测试初始化问题