2016-11-01 39 views
1

私は以下のような静的メソッドをモックしようとしていますが、静的イニシャライザによってブロックされています。ここ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 

私が思う以下のコードを参照してください私はこのクラスをこのように模倣することはできませんが、私はこれを模倣する方法を知らない。どのように私はそれを修正することができますどのアイデア?

+0

私は同様の問題を抱えていたので、私はjmockitに切り替えましたが、これは簡単な解決策です。もう一つの可能​​性は、単純なMockitoを使ってもテストするのが簡単な静的メソッドへの直接の依存関係を壊すためにリファクタリングを行うことです。 –

+0

これは古いコードです。 init関数は多くの作業をしますので、リファクタリングは危険な仕事です – changzhz

答えて

2

そして、モックの残りの部分は静的なvoidメソッドのモックのようになりますとexception.hereをThowさんするPowerMockito.doThrow()メソッドはサンプルです言及した例外

@SuppressStaticInitializationFor("packageName.StaticInitializerService") 

を避けるために、以下の行を追加してください。あなたのクラスの例外をスローしていないコード

import org.junit.Test; 
    import org.junit.runner.RunWith; 
    import org.powermock.api.mockito.PowerMockito; 
    import org.powermock.core.classloader.annotations.PrepareForTest; 
    import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; 
    import org.powermock.modules.junit4.PowerMockRunner; 
    @RunWith(PowerMockRunner.class) 
    @PrepareForTest(StaticInitializerService.class) 
    @SuppressStaticInitializationFor("PackageName.StaticInitializerService") 
    public class StaticInitializerServiceTest { 
    @Test 
    public void method() { 
    PowerMockito.mockStatic(StaticInitializerService.class); 
    } 
    } 
+0

ありがとうございます! – changzhz

+0

正しい回答として受け入れる –

関連する問題