2017-10-15 12 views
0

Unité de configuration de testPowermock ExceptionInInitializerError avec 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; 

} 

} 

J'ai essayé de lancer le test unitaire, il a échoué dans le test instancier avec l'erreur suivante

de java.lang.ExceptionInInitializerError au soleil. reflect.GeneratedSerializationConstructorAccessor7.newInstance (Inconnu Source) au 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) à org .powermock.api.mockito.internal.mockcreation.MockCreator.mock (MockCreator.java:60) à org.powermock.api.mockito.PowerMockito.mock (PowerMockito.java:143) à org.powermock.api. 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) au 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) au 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) à org. powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run (JUnit4TestSuiteChunkerImpl.java:104) à 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) à org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:192) causés par: java.lang.NullPointerException à au com.bdd.domain.biz.pgwclient.DynamicConfigListener.getAttributeValue (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)

Répondre

1

Lorsque vous essayez de vous moquer de méthodes statiques avec PowerMock, il crée en interne une instance de la classe. Ainsi, lorsque vous

PowerMockito.mockStatic(PGWClient.class); 

Une nouvelle instance de la classe est créée dans PowerMock. Votre constructeur par défaut de classe PGWClient effectue une initialisation appelant des méthodes statiques à ce moment. Cela provoque l'échec de la simulation statique.

Vous devriez pouvoir vérifier Mock Suppressing Unwanted Behavior


EDIT

De trace de la pile, on peut voir que PGWClient accède par exemple de PGWCommunicator via la méthode getInstance. Il y a un comportement indésirable à l'intérieur. Vous pouvez

  1. son comportement en utilisant Supprimer informations du lien ci-dessus
  2. Créer un défaut (package) ou une méthode protégée setInstance pour remplacer objet retourné lors d'essais
  3. déplacer Idéalement de Occurrence singleton à DI entrave. Un tel code est un moyen plus testable.
+0

Merci pour la suggestion! J'ai ajouté ceci dans mon code PowerMockito.suppress (PowerMockito.constructor (PGWClient.class)); Toujours ne fonctionne pas Mais si j'ai supprimé le client @Mock PGWClient. Ça va marcher. Mais j'ai vraiment besoin de celui-là –

+0

Il semble qu'il a échoué dans le client @Mock PGWClient. Quand il a essayé d'instancier celui-ci, il a échoué. –

+0

Vous empilez la trace montre que 'PGWCommunicator' est créé en interne' getInstance() '. Je suggère de supprimer cette création d'objet ou de se moquer de sa méthode d'instance. Désolé, ce n'est pas un constructeur de superclasse comme je le pensais. –