У меня есть собственный проект, который отлично работал с Java 8. Я использую самые базовые среды тестирования - TestNG и JMockit.
Недавно я обновил свою версию Java до Java 9 и заметил, что тест JMockit не удался с проблемой доступа к модулям Java.Google привел меня к этому решению о переполнении стека. модуль java.base не читает модуль java.desktop , рекомендующий обновить 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 этой насмешкиframework.
Заранее благодарим вас за ваши варианты.