これが私の場合です。AbstractController クラスがあります。サブクラス Controller があります。AbstractController のメソッドの 1 つで、新しい ApplicationLock がインスタンス化されます。Controller の 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 at com.acompany.controller.common.AbstractController.(AbstractController.java:65)
private static final String DEFAULT_FOLDER = AbstractController.class.getProtectionDomain().getCodeSource()
.getLocation().getPath();
完全なスタック トレースは次のとおりです。
javassist.runtime.Desc.getClassObject(Desc.java:44) の java.lang.Class.forName(Class.java:169) の java.lang.Class.forName0(ネイティブ メソッド) で java.lang.ExceptionInInitializerError。 javassist.runtime.Desc.getType(Desc.java:123) の runtime.Desc.getClassType(Desc.java:153) com.acompany.controller.portfolio の javassist.runtime.Desc.getType(Desc.java:79) .ControllerTest.testIncrementalFail(ControllerTest.java:195) の sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブ メソッド) の sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) :25) org.powermock で org.junit.internal.runners.TestMethod.invoke(TestMethod.java:66) で java.lang.reflect.Method.invoke(Method.java:597) で。modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:307) org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:86) at org.junit.internal.runners.MethodRoadie org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294) の .runBeforesThenTestThenAfters(MethodRoadie.java:94) .executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:112) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:73) org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282) で org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:84) で org.junit org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207) の .internal.runners.MethodRoadie.run(MethodRoadie.java:49) org.powermock.modules.junit4.internal.impl の.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146) org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120) org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.ジャバ:34) org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:118) で org.powermock.modules で org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44) で.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:102) at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53) at org.eclipse.jdt .internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at 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 at com.acompany.controller.common.AbstractController.(AbstractController.java:65) ... 35 詳細