0

Je teste une classe avec PowerMockRunner qui récupère un ENUM value à partir d'une méthode statique dans une classe auxiliaire. Un pointeur NULL est levé lorsque ce value ENUM est transmis dans une instruction SWITCH dans classUnderTest.Énumération de PowerMockito dans Switch Éjection de déclaration NPE

J'ai débogué et peut voir le ENUM est réglé correctement (nom, type, ordinal tout comme prévu) donc je ne suis pas sûr de savoir pourquoi le NPE est levé. Quelqu'un rencontre un problème similaire?

Remarque: PowerMockito est requis comme classUnderTest inclut les appels à des méthodes privées. Voici un exemple complet avec beaucoup de code (sans rapport avec le problème) supprimé. Les commentaires ajoutés au point où ENUM est réglé et NPE est jeté

ClassUnderTest:

public class TestService extends BaseXAServiceBean 
{ 

@Override 
public ValueObject runExecute(ValueObject param) throws RemoteException, ServiceException 
{ 
    try 
    { 
     ValueEnum value = ValueServiceHelper.getValueType(param1(), 
        param2()); 
     // value populated successfully with ENUM at this point   


     // NPE thrown when value is passed into below switch 
     switch (value) 
     { 
      case VALUE1: 
      {      
       // logic here... 
       break; 
      } 

      case VALUE2: 
      {      
       // logic here... 
       break; 
      } 

      case VALUE3: 
      {      
       // logic here... 
       break; 
      } 
     } 
    } 
    catch (ServiceException e) 
    { 
     throw e; 
    } 
    catch (Exception e) 
    { 
     throw new ServiceException(e, AppErrorCodes.INT.SL06, AppErrorCodes.SL06.E04); 
    } finally { 
     // clean up 
    } 
} 
} 

classe d'aide avec la méthode statique:

public class ValueServiceHelper 
{ 
public static ValueEnum getValueType(String param1, String param2) throws ServiceException 
    { 
     ValueEnum retVal = ValueEnum.VALUE3; 

     // proxy is mocked 
     ProductProxy proxy = ProxyFactory.createFactory("1").getProductProxy(); 

     try 
     { 
      if (proxy.isValue1(param2)) 
      { 
       retVal = ValueEnum.VALUE1; 
      } 
      else if (proxy.isValue2(param2)) 
      { 
       retVal = ValueEnum.VALUE2; 
      } 

     } 
     return retVal; 
    } 
} 

Classe d'essai:

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ProxyFactory.class}) 
public class ValueTest { 

@Spy 
@InjectMocks 
private TestService service = new TestService(); 

@Mock 
private ProxyFactory proxyFactory; 

@Mock 
private Proxy proxy; 

@Before 
public void setUp() throws Exception { 
    MockitoAnnotations.initMocks(this); 

    PowerMockito.mockStatic(ProxyFactory.class); 
} 

@Test 
public void testSuccess() throws Exception { 
    // given 

    // when 
PowerMockito.when(ProxyFactory.createFactory("1")).thenReturn(proxyFactory); 
PowerMockito.when(proxyFactory.getProductProxy()).thenReturn(proxy); 
    PowerMockito.when(proxy.isValue1(param2)).thenReturn(true); 
    PowerMockito.when(proxy.isValue2(param2)).thenReturn(true); 
    service.runExecute(request);   

    // then 

} 
} 
+1

Vous devez fournir un exemple complet et vérifiable. Il n'y a pas assez d'informations ici pour répondre. –

+0

Mise à jour maintenant pour inclure l'exemple complet .... –

+1

[Peut-être lié?] (Https://github.com/powermock/powermock/issues/394) Voyez si l'utilisation d'une instruction 'if' résout le problème. –

Répondre

1

C'est un problème avec PowerMock qui a existé since at least 2015. La seule façon de résoudre ce problème est d'utiliser les instructions if au lieu d'un switch.