Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Powermock模拟类的构造函数时获得ExceptionInInitializerError。如何修复它?_Java_Unit Testing_Testing_Powermock - Fatal编程技术网

Java 使用Powermock模拟类的构造函数时获得ExceptionInInitializerError。如何修复它?

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

这是我的案子。我有一个AbstractController类。它有一个子类控制器。在AbstractController的一个方法中,实例化了一个新的ApplicationLock。我想在为控制器编写ut时模拟ApplicationLock。我写了一个如下的测试用例

@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());