0

ヘルパークラスの静的メソッドからvalue ENUMを取得するPowerMockRunnerでクラスをテストしています。このvalue ENUMがclassUnderTestのSWITCH文に渡されると、NULLポインタがスローされます。Switch StatementのPowerMockito列挙型NPE

私はデバッグしましたが、ENUMが正しく設定されている(名前、タイプ、序数がすべて期待どおりになっている)ので、NPEがスローされる理由は不明です。誰も似たような問題に遭遇しますか?

注:classUnderTestにはプライベートメソッドの呼び出しが含まれているため、PowerMockitoが必要です。以下は、(問題に無関係の)多くのコードが削除された完全な例です。静的メソッドと

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 
    } 
} 
} 

ヘルパークラス:

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; 
    } 
} 

テストクラス:

@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

完全で検証可能な例を提供する必要があります。答えが出るほどの情報がありません。 –

+0

今すぐ完全な例を含めるように更新しました.... –

+1

[おそらく関連していますか?](https://github.com/powermock/powermock/issues/394) 'if'文を使用して問題を解決するかどうかを確認してください。 –

答えて

1

これは、ENUMが設定され、NPEが

ClassUnderTestスローされた時点で追加されたコメント存在していたPowerMockの問題since at least 2015。私が知っているそれを修正する唯一の方法は、switchの代わりにifステートメントを使用することです。