Java 使用Powermock模拟类的构造函数时获得ExceptionInInitializerError。如何修复它?
这是我的案子。我有一个AbstractController类。它有一个子类控制器。在AbstractController的一个方法中,实例化了一个新的ApplicationLock。我想在为控制器编写ut时模拟ApplicationLock。我写了一个如下的测试用例Java 使用Powermock模拟类的构造函数时获得ExceptionInInitializerError。如何修复它?,java,unit-testing,testing,powermock,Java,Unit Testing,Testing,Powermock,这是我的案子。我有一个AbstractController类。它有一个子类控制器。在AbstractController的一个方法中,实例化了一个新的ApplicationLock。我想在为控制器编写ut时模拟ApplicationLock。我写了一个如下的测试用例 @test public void testMethod(){ ApplicationLock mockLock=PowerMockito.mock(ApplicationLock.class); PowerMock
@test
public void testMethod(){
ApplicationLock mockLock=PowerMockito.mock(ApplicationLock.class);
PowerMockito.when(mockLock.tryObtain()).thenReturn(true);
PowerMockito.whenNew(ApplicationLock.class).withArguments(argThat(new IsFile()),anyString()).thenReturn(mockLock);
}
我已经向测试类添加了必要的注释
@RunWith(PowerMockRunner.class)
@PrepareForTest({AbstractController.class})
但是我在运行这个测试用例时遇到了以下错误。这是AbstractController中的静态初始值设定项
原因:java.lang.NullPointerException
在com.acompany.controller.common.AbstractController.(AbstractController.java:65)
完整堆栈跟踪如下所示
java.lang.ExceptionInInitializerRor位于
java.lang.Class.forName0(本机方法)位于
java.lang.Class.forName(Class.java:169)位于
javassist.runtime.Desc.getClassObject(Desc.java:44)位于
javassist.runtime.Desc.getClassType(Desc.java:153)位于
javassist.runtime.Desc.getType(Desc.java:123)位于
javassist.runtime.Desc.getType(Desc.java:79)位于
com.acompany.controller.portfolio.ControllerTest.testIncrementalFail(ControllerTest.java:195)
位于的sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
invoke(NativeMethodAccessorImpl.java:39)
在
reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
位于java.lang.reflect.Method.invoke(Method.java:597)
org.junit.internal.runners.TestMethod.invoke(TestMethod.java:66)位于
org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:307)
在
org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:86)
在
org.junit.internal.runners.MethodRoadie.runbeforesthentestthenuter(MethodRoadie.java:94)
在
org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294)
在
org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:112)
在
org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:73)
在
org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runbeforesthenTestthenAfter(PowerMockJUnit44RunnerDelegateImpl.java:282)
在
org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:84)
位于org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
在
org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateinpl.invokeTestMethod(powermockjunit44runnerdelegateinpl.java:207)
在
org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateinpl.runMethods(powermockjunit44runnerdelegateinpl.java:146)
在
org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateinpl$1.run(powermockjunit44runnerdelegateinpl.java:120)
在
org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
在
org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
在
org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateinpl.run(powermockjunit44runnerdelegateinpl.java:118)
在
org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:102)
在
org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
在
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
在
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
在
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
在
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
在
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
在
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
原因:java.lang.NullPointerException位于
com.acompany.controller.common.AbstractController.(AbstractController.java:65)
... 35多
你可以使用:
@SuppressStaticInitializationFor({AbstractController.class})
然后,在测试用例中,手动设置所有需要初始化的静态字段,包括默认的\u文件夹:
Whitebox.setInternalState(Controller.class, "DEFAULT_FOLDER", "abcd");
Whitebox.setInternalState(Controller.class, "OTHER_FIELD", new Object());
方法
Class.getProtectionDomain()
太依赖于使用的类加载器,因此您可能无法在JUnit/PowerMock中使用它,因为JUnit/PowerMock使用它们自己的方法。谢谢。我试过了。但我不能抑制AbstractController中的所有静态初始值设定项。如果这样做,我将得到空指针。
Whitebox.setInternalState(Controller.class, "DEFAULT_FOLDER", "abcd");
Whitebox.setInternalState(Controller.class, "OTHER_FIELD", new Object());