2017-10-15 2 views
0

Einheit Test-SetupPowerMock ExceptionInInitializerError mit 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; 

} 

} 

Ich habe versucht, das Gerät Test auszuführen, ist es im Test nicht bestanden instanziiert mit dem folgenden Fehler

java.lang.ExceptionInInitializerError bei Sonne. reflect.GeneratedSerializationConstructorAccessor7.newInstance (Unbekannt Quelle) um java.lang.reflect.Constructor.newInstance (Constructor.java:526) um org.objenesis.instantiator.sun.SunReflec tionFactoryInstantiator.newInstance (SunReflectionFactoryInstantiator.java:40) bei org.objenesis.ObjenesisBase.newInstance (ObjenesisBase.java:59) bei org.mockito.internal.creation.jmock.ClassImposterizer.createProxy (ClassImposterizer.java:128) bei org.mockito.internal.creation.jmock.ClassImposterizer.imposterise (ClassImposterizer.java:63) bei org.powermock.api.mockito.internal.mockcreation.MockCreator.createMethodInvocationControl (MockCreator.java:111) bei org .powermock.api.mockito.internal.mockcreation.MockCreator.mock (MockCreator.java:60) bei org.powermock.api.mockito.PowerMockito.mock (PowerMockito.java:143) um org.powermock.api. extension.listen er.AnnotationEnabler.standardInject (AnnotationEnabler.java:84) bei org.powermock.api.extension.listener.AnnotationEnabler.beforeTestMethod (AnnotationEnabler.java:51) bei org.powermock.tests.utils.impl.PowerMockTestNotifierImpl. notifyBeforeTestMethod (PowerMockTestNotifierImpl.java:90) bei org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl $ PowerMockJUnit44MethodRunner.executeTest (PowerMockJUnit44RunnerDelegateImpl.java:292) bei org.powermock.modules.junit4.internal.impl. PowerMockJUnit47RunnerDelegateImpl $ PowerMockJUnit47MethodRunner.executeTestInSuper (PowerMockJUnit47RunnerDelegateImpl.java:127) unter org.powermock.modules.junit4.internal.impl.PowerMockJ Unit47RunnerDelegateImpl $ PowerMockJUnit47MethodRunner.executeTest (PowerMockJUnit47RunnerDelegateImpl.java:82) bei org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl $ PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters (PowerMockJUnit44RunnerDelegateImpl.java:282) bei org.junit.internal.runners. MethodRoadie.runTest (MethodRoadie.java:84) bei org.junit.internal.runners.MethodRoadie.run (MethodRoadie.java:49) bei org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod (PowerMockJUnit44RunnerDelegateImpl .java: 207) unter org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods (PowerMockJUnit44RunnerDelegateImpl.java:1 46) bei org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl $ 1.run (PowerMockJUnit44RunnerDelegateImpl.java:120) bei org.junit.internal.runners.ClassRoadie.runUnprotected (ClassRoadie.java:34) bei org.junit.internal.runners.ClassRoadie.runProtected (ClassRoadie.java:44) bei org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run (PowerMockJUnit44RunnerDelegateImpl.java:118) bei org. powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run (JUnit4TestSuiteChunkerImpl.java:104) unter org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run (AbstractCommonPowerMockRunner.java:53) bei org.powermock.modules.junit4.PowerMockRunner.run (PowerMockRunner.java:53) bei org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run (JUnit4TestReference.java:50) bei org.eclipse.jdt.internal.junit.runner.TestExecution.run (TestExecution.java:38) bei org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:459) bei org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:675) bei org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run (RemoteTestRunner.java:382) bei org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:192) Verursacht durch: java.lang.NullPointerException bei bei com.bdd.domain.biz.pgwclient.DynamicConfigListener.getAttributeValue (DynamicConfigListener.java:132) bei com.bdd.domain.biz.pgwclient.PGWCommunicator.init (PGWCommunicator.java:95) bei com.ebay.domain.biz.pgwclient.PGWCommunicator (PGWCommunicator.java.: 83) bei com.bdd.domain.biz.pgwclient.PGWCommunicator.getInstance (PGWCommunicator.java:62) bei com.bdd.domain.biz.pgwclient.PGWClient. (PGWClient.java:117)

Antwort

1

Wenn Sie versuchen, statische Methoden mit PowerMock zu übernehmen, wird intern eine Instanz der Klasse erstellt. Wenn Sie also

PowerMockito.mockStatic(PGWClient.class); 

Neue Instanz der Klasse wird in PowerMock erstellt. Ihr Klassenkonstruktor PGWClient führt einige Initialisierungen durch, die zu diesem Zeitpunkt statische Methoden aufrufen. Dies führt dazu, dass statisches Mocking fehlschlägt.

Sie auf der Power Mock Suppressing Unwanted Behavior


EDIT

Von Stapel überprüfen sollte es verfolgen zu erkennen, dass PGWClient zugreift Instanz von PGWCommunicator über getInstance Methode. Es gibt ein unerwünschtes Verhalten im Inneren. Sie können

  1. Unterdrückt sein Verhalten von Link oben
  2. einen Standard erstellen mit info (Paket) oder geschützte setInstance Methode Objekt zu ersetzen während der Tests zurück
  3. Ideale von Singleton-Instanz Fesseln DI bewegen. Ein solcher Code ist besser testbar.
+0

Danke für den Vorschlag! Ich habe dies in meinem Code PowerMockito.suppress (PowerMockito.constructor (PGWClient.class)); Immer noch nicht funktioniert Aber wenn ich @Mock PGWClient Client gelöscht. Es wird klappen. Aber ich brauche das wirklich. –

+0

Es sieht aus wie es im @Mock PGWClient Client fehlgeschlagen ist. Als es versucht hat, dieses zu instanziieren, ist es gescheitert. –

+0

Sie Stack-Trace zeigt, dass intern 'PGWCommunicator' über' getInstance() 'erstellt wird. Ich würde vorschlagen, diese Objekterstellung zu unterdrücken oder ihre Instanzmethode statisch zu verspotten. Entschuldigung, das ist kein Superklassenkonstruktor, wie ich dachte. –

Verwandte Themen