升级到 1.43 版本后无法 运行 JMockit 测试
Unable to run JMockit tests after upgrading to 1.43 version
我有自己的项目,曾经与 Java 完美配合 Java 8. 我使用的最基本的测试框架是 TestNG 和 JMockit。
最近我将 Java 版本升级到 Java 9,我注意到 JMockit 测试因 java 模块访问问题而失败。 Google 将我带到这个堆栈溢出接受的解决方案 建议将 JMockit 升级到 1.34 或更高版本。之后我将它升级到目前的最新版本 1.43.
进行此升级后,我无法再进行 运行 测试,我得到的只是控制台输出中的 NullPointerException。我重现该问题的测试如下:
package com.my.org;
import mockit.FullVerifications;
import mockit.Injectable;
import mockit.Tested;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class JMockitIssueTest {
private class Delegate {
public void doSomething() {
System.out.println("Doing something");
}
}
private class ClassUnderTest {
private final Delegate delegate;
private ClassUnderTest(Delegate delegate) {
this.delegate = delegate;
}
public void useDelegate() {
delegate.doSomething();
}
}
@BeforeMethod
public void setUp() throws Exception {
}
@Injectable
private Delegate delegate;
@Tested
private ClassUnderTest classUnderTest;
@Test
public void itShouldUseDelegate() {
classUnderTest.useDelegate();
new FullVerifications() {{
delegate.doSomething();
}};
}
}
最初 setUp 方法不存在,但在添加一个空方法后,我在下面列出的控制台输出中获得了更多信息:
Test ignored.
java.lang.NullPointerException
at mockit.integration.testng.TestNGRunnerDecorator.beforeInvocation(TestNGRunnerDecorator.java:32)
at org.testng.internal.invokers.InvokedMethodListenerInvoker$InvokeBeforeInvocationWithoutContextStrategy.callMethod(InvokedMethodListenerInvoker.java:84)
at org.testng.internal.invokers.InvokedMethodListenerInvoker.invokeListener(InvokedMethodListenerInvoker.java:62)
at org.testng.internal.Invoker.runInvokedMethodListeners(Invoker.java:493)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:533)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
at org.testng.TestRunner.privateRun(TestRunner.java:648)
at org.testng.TestRunner.run(TestRunner.java:505)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
at org.testng.SuiteRunner.run(SuiteRunner.java:364)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1137)
at org.testng.TestNG.runSuites(TestNG.java:1049)
at org.testng.TestNG.run(TestNG.java:1017)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)
我尝试了多种排列,例如使用 @Mocked Delegate
实例并自己创建 ClassUnderTest
,甚至回滚到 Java 8。运气不好。
我什至尝试将测试转移到 jUnit(这并不是一个理想的选择,因为有超过 1400 个测试 类)。目前我 运行 没有想法,但另一方面,上面的用例是如此基础,以至于我真的希望我在做一件愚蠢的事情,而没有意识到自从我使用以来 JMockit 世界发生了什么变化此模拟框架的 1.27 版本。
提前感谢您的选择。
也许@Rogério 的意思是查看 Release Notes,其中从 1.42 版开始需要使用 -javaagent JVM 参数。
试试看,Running Tests部分也提到了
我有自己的项目,曾经与 Java 完美配合 Java 8. 我使用的最基本的测试框架是 TestNG 和 JMockit。
最近我将 Java 版本升级到 Java 9,我注意到 JMockit 测试因 java 模块访问问题而失败。 Google 将我带到这个堆栈溢出接受的解决方案
进行此升级后,我无法再进行 运行 测试,我得到的只是控制台输出中的 NullPointerException。我重现该问题的测试如下:
package com.my.org;
import mockit.FullVerifications;
import mockit.Injectable;
import mockit.Tested;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class JMockitIssueTest {
private class Delegate {
public void doSomething() {
System.out.println("Doing something");
}
}
private class ClassUnderTest {
private final Delegate delegate;
private ClassUnderTest(Delegate delegate) {
this.delegate = delegate;
}
public void useDelegate() {
delegate.doSomething();
}
}
@BeforeMethod
public void setUp() throws Exception {
}
@Injectable
private Delegate delegate;
@Tested
private ClassUnderTest classUnderTest;
@Test
public void itShouldUseDelegate() {
classUnderTest.useDelegate();
new FullVerifications() {{
delegate.doSomething();
}};
}
}
最初 setUp 方法不存在,但在添加一个空方法后,我在下面列出的控制台输出中获得了更多信息:
Test ignored.
java.lang.NullPointerException
at mockit.integration.testng.TestNGRunnerDecorator.beforeInvocation(TestNGRunnerDecorator.java:32)
at org.testng.internal.invokers.InvokedMethodListenerInvoker$InvokeBeforeInvocationWithoutContextStrategy.callMethod(InvokedMethodListenerInvoker.java:84)
at org.testng.internal.invokers.InvokedMethodListenerInvoker.invokeListener(InvokedMethodListenerInvoker.java:62)
at org.testng.internal.Invoker.runInvokedMethodListeners(Invoker.java:493)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:533)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
at org.testng.TestRunner.privateRun(TestRunner.java:648)
at org.testng.TestRunner.run(TestRunner.java:505)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
at org.testng.SuiteRunner.run(SuiteRunner.java:364)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1137)
at org.testng.TestNG.runSuites(TestNG.java:1049)
at org.testng.TestNG.run(TestNG.java:1017)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)
我尝试了多种排列,例如使用 @Mocked Delegate
实例并自己创建 ClassUnderTest
,甚至回滚到 Java 8。运气不好。
我什至尝试将测试转移到 jUnit(这并不是一个理想的选择,因为有超过 1400 个测试 类)。目前我 运行 没有想法,但另一方面,上面的用例是如此基础,以至于我真的希望我在做一件愚蠢的事情,而没有意识到自从我使用以来 JMockit 世界发生了什么变化此模拟框架的 1.27 版本。
提前感谢您的选择。
也许@Rogério 的意思是查看 Release Notes,其中从 1.42 版开始需要使用 -javaagent JVM 参数。
试试看,Running Tests部分也提到了