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
}
}
Vous devez fournir un exemple complet et vérifiable. Il n'y a pas assez d'informations ici pour répondre. –
Mise à jour maintenant pour inclure l'exemple complet .... –
[Peut-être lié?] (Https://github.com/powermock/powermock/issues/394) Voyez si l'utilisation d'une instruction 'if' résout le problème. –