2017-10-15 158 views
0

單元測試設置Powermock ExceptionInInitializerError,使用Junit的

@RunWith(PowerMockRunner.class) 
@PrepareForTest(PGWService.class) 
public class PGWServiceTest { 
public static final String TEST_CLIENTTRX_ID = "12345"; 
public static final int TEST_SITE_ID = 0; 
public static final long TEST_USER_ID = 12345L; 
public static final int TEST_CURRENCY_ID = 1; 
public static final String TEST_ACCOUNT_TYPE = "Test account type"; 
public static final boolean TEST_IS_DEDUPING = false; 
public static final byte[] TEST_SSN_CRYPT = new byte[] { 1, 2, 3 }; 
public static final byte[] TEST_TAX_ID_CRYPT = new byte[] { 1, 2, 3 }; 
public static final String TEST_SSN_LAST_FOUR = "1234"; 
public static final String TEST_TAX_ID_LAST_FOUR = "1234"; 

@Mock 
PGWBaseRequest request; 

@Mock 
PGWClient client; 

PGWService pGWService = new PGWService(); 

PGWGetAccountTaxIDResponse expectedResponse = this 
     .buildGPWGetAccountIdResponse(TEST_SSN_CRYPT, TEST_TAX_ID_CRYPT, 
       TEST_SSN_LAST_FOUR, TEST_TAX_ID_LAST_FOUR); 

@Before 
public void setUp() throws Exception { 
    PowerMockito.mockStatic(PGWClient.class); 
    PowerMockito.mockStatic(PGWBaseRequest.class); 
    PowerMockito.when(PGWClient.getInstance()).thenReturn(client); 
    PowerMockito 
      .whenNew(PGWBaseRequest.class) 
      .withArguments(TEST_CLIENTTRX_ID, TEST_SITE_ID, TEST_USER_ID, 
        TEST_CURRENCY_ID, TEST_ACCOUNT_TYPE, TEST_IS_DEDUPING) 
      .thenReturn(request); 
    PowerMockito.when(client.getTaxIdInformation(request)).thenReturn(
      expectedResponse); 
} 

@Test 
public void testGetTaxIdInformationHappyPath() throws PGWException { 

    PGWGetAccountTaxIDResponse actualResponse = pGWService 
      .getTaxIdInformation(TEST_CLIENTTRX_ID, TEST_SITE_ID, 
        TEST_USER_ID, TEST_CURRENCY_ID, TEST_ACCOUNT_TYPE, 
        TEST_IS_DEDUPING); 
    Assert.assertEquals(expectedResponse.getSSNLastFour(), 
      actualResponse.getSSNLastFour()); 
} 

private PGWGetAccountTaxIDResponse buildGPWGetAccountIdResponse(
     byte[] ssnCrypt, byte[] taxIdCrypt, String ssnLastFour, 
     String taxIdLastFour) { 
    PGWGetAccountTaxIDResponse response = new PGWGetAccountTaxIDResponse(); 
    response.setSSNCrypt(ssnCrypt); 
    response.setSSNLastFour(ssnLastFour); 
    response.setTaxIDCrypt(taxIdCrypt); 
    response.setTaxIDLastFour(taxIdLastFour); 
    return response; 

} 

} 

我試圖運行單元測試,它的測試失敗實例,出現以下錯誤

java.lang.ExceptionInInitializerError在 的太陽。 reflection.GeneratedSerializationConstructorAccessor7.newInstance(Unknown Source)at java.lang.reflect.Constructor.newInstance(Constructor.java:526)at org.objenesis.instantiator.sun.SunReflec tionFactoryInstantiator.newInstance(SunReflectionFactoryInstantiator.java:40) 在org.objenesis.ObjenesisBase.newInstance(ObjenesisBase.java:59)在 org.mockito.internal.creation.jmock.ClassImposterizer.createProxy(ClassImposterizer.java:128) 在 org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:63) 在 org.powermock.api.mockito.internal.mockcreation.MockCreator.createMethodInvocationControl(MockCreator.java:111) 在 有機(PowerMockito.java:143) 在 org.powermock.api上的.powermock.api.mockito.internal.mockcreation.MockCreator.mock(MockCreator.java:60) 。 extension.listen er.AnnotationEnabler.standardInject(AnnotationEnabler.java:84) 在 org.powermock.api.extension.listener.AnnotationEnabler.beforeTestMethod(AnnotationEnabler.java:51) 在 org.powermock.tests.utils.impl.PowerMockTestNotifierImpl。 notifyBeforeTestMethod(PowerMockTestNotifierImpl.java:90) 在 org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl $ PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:292) 在 org.powermock.modules.junit4.internal.impl。 PowerMockJUnit47RunnerDelegateImpl $ PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127) at org.powermock.modules.junit4.internal.impl.PowerMockJ Unit47RunnerDelegateImpl $ PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82) 在 org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl $ PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(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.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl .java:207) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:1 46) 在 org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl $ 1.run(PowerMockJUnit44RunnerDelegateImpl.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.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:118) 在 有機powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:104) at org.powermock.modules.junit4.common.internal.impl。AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53) 在 org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:53) 在 org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run( JUnit4TestReference.java:50) 在 org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests( RemoteTestRunner.java:459) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run( RemoteTestRunner.java:382)在在 com.bdd.domain.biz.pgwclient.DynamicConfigListener.getAttributeValue顯示java.lang.NullPointerException:在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 引起(DynamicConfigListener.java:132) 在 com.bdd.domain.biz.pgwclient.PGWCommunicator.init(PGWCommunicator.java:95) 在 com.ebay.domain.biz.pgwclient.PGWCommunicator(PGWCommunicator.java: 83) 在 com.bdd.domain.biz.pgwclient.PGWCommunicator.getInstance(PGWCommunicator.java:62) 在com.bdd.domain.biz.pgwclient.PGWClient。(PGWClient.java:117)

回答

1

當您試圖用PowerMock模擬靜態方法時,它會在內部創建該類的一個實例。所以當你

PowerMockito.mockStatic(PGWClient.class); 

該類的新實例是在PowerMock中創建的。你的PGWClient類的默認構造函數在這時執行一些初始化調用靜態方法。這會導致靜態模擬失敗。

您應檢查電源模擬Suppressing Unwanted Behavior


編輯

從堆棧跟蹤可以看出,PGWClient通過getInstance方法訪問的 PGWCommunicator實例。裏面有一些不需要的行爲。您可以

  1. 禁止使用從鏈接信息它的行爲上面
  2. 創建一個默認(包)或保護setInstance方法來代替在測試過程中
  3. 對象返回理想擺脫單一實例羈絆DI。這樣的代碼是一種更可測試的方式。
+0

感謝您的建議!我在我的代碼PowerMockito.suppress(PowerMockito.constructor(PGWClient.class))中添加了這個; 仍然不能正常工作 但是,如果我刪除了@Mock PGWClient客戶端。它會工作。但我真的需要那個 –

+0

它看起來像在@Mock PGWClient客戶端失敗。當它嘗試實例化這個時,它失敗了。 –

+0

堆棧跟蹤顯示內部'PGWCommunicator'是通過'getInstance()'創建的。我會建議禁止這個對象創建或靜態模擬其實例方法。對不起,這不是我想的超類構造函數。 –

相關問題