私は以下のような静的メソッドをモックしようとしていますが、静的イニシャライザによってブロックされています。ここstatic Initializerで呼び出されたPowerMockitoを使ってjavaでプライベート静的メソッドをモックする方法は?
public class StaticInitializerService {
static{
init();
}
private static void init(){
throw new UnsupportedOperationException();
}
private static String getString(){
throw new UnsupportedOperationException();
}
public static String method(){
return getString();
}
}
は私のテストケースである:
@PrepareForTest(StaticInitializerService.class)
public class StaticInitializerServiceTest extends PowerMockTestCase{
@ObjectFactory
public ITestObjectFactory getObjectFactory() {
return new PowerMockObjectFactory();
}
@Test
public void method() {
PowerMockito.mockStatic(StaticInitializerService.class);
}
}
私は、それはすべて、次の例外を発生させ、mockstaticとスパイを使用しよう:
java.lang.ExceptionInInitializerError
at sun.reflect.GeneratedSerializationConstructorAccessor4.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.newInstance(SunReflectionFactoryInstantiator.java:45)
at org.objenesis.ObjenesisBase.newInstance(ObjenesisBase.java:73)
at org.mockito.internal.creation.instance.ObjenesisInstantiator.newInstance(ObjenesisInstantiator.java:14)
at org.powermock.api.mockito.repackaged.ClassImposterizer.createProxy(ClassImposterizer.java:143)
at org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:58)
at org.powermock.api.mockito.internal.mockcreation.MockCreator.createMethodInvocationControl(MockCreator.java:111)
at org.powermock.api.mockito.internal.mockcreation.MockCreator.mock(MockCreator.java:59)
at org.powermock.api.mockito.PowerMockito.spy(PowerMockito.java:234)
at com.zghome.mvndemo.TestNGDemo.powermock.service.testng.StaticInitializerServiceTest.method(StaticInitializerServiceTest.java:22)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:639)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:816)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1124)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)
at org.testng.TestRunner.privateRun(TestRunner.java:774)
at org.testng.TestRunner.run(TestRunner.java:624)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:359)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:354)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:312)
at org.testng.SuiteRunner.run(SuiteRunner.java:261)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1215)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1140)
at org.testng.TestNG.run(TestNG.java:1048)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:126)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:152)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:57)
Caused by: java.lang.UnsupportedOperationException
at com.zghome.mvndemo.TestNGDemo.powermock.service.StaticInitializerService.init(St aticInitializerService.java:10)
at com.zghome.mvndemo.TestNGDemo.powermock.service.StaticInitializerService. <clinit>(StaticInitializerService.java:6)
... 35 more
私が思う以下のコードを参照してください私はこのクラスをこのように模倣することはできませんが、私はこれを模倣する方法を知らない。どのように私はそれを修正することができますどのアイデア?
私は同様の問題を抱えていたので、私はjmockitに切り替えましたが、これは簡単な解決策です。もう一つの可能性は、単純なMockitoを使ってもテストするのが簡単な静的メソッドへの直接の依存関係を壊すためにリファクタリングを行うことです。 –
これは古いコードです。 init関数は多くの作業をしますので、リファクタリングは危険な仕事です – changzhz