2017-05-10 3 views
0

他のプライベートな静的メソッドを呼び出すこのメソッドをどうやって模擬することができますか?他のプライベート静的メソッドを呼び出す静的メソッドをモックするにはどうすればよいですか?

public class testA { 
    public static JSONObject retrieveOrder(String orderId) 
       throws Exception { 
      String url = "/contract/"; 
      JSONObject order = new JSONObject(); 
      order.put("orderId", orderId); 
      return orderPOST(url, order); 
     } 

    private static orderPOST(String url, JSONObject order) { 
     return orderPOSTString(url, order.toString()); 
    } 

    private static orderPOSTString (String url, String order) { 
     //do another call to method which will return JSONObject 
    } 
} 

どのように私はちょうど私がそれらのプライベートのいずれかの方法を気にしないだけとしてretrieveOrder方法を模擬することができますか?これらの私的静的メソッドについては、私はそれらを変更することはできませんので、そのまま受け入れる必要があります。

これは私のテストで:

@Test 
    public void testRetrieveOrderMethod() throws Exception { 
     String url = "/contract/"; 
     JSONObject order = new JSONObject(); 
     order.put("orderId", orderId); 
     PowerMockito.spy(testA.class); 
     PowerMockito.doReturn(url, order.toString()).when(testA.class, "orderPOST", Matchers.any(), Matchers.any()); 
     JSONObject retrieved = testA.retrieveOrder("12345"); 
    } 

私はここで何かを逃した場合、私に知らせてください。私はNullPointerExceptionを実際にそれらのプライベートメソッドを呼び出すと思うので、続けています。

+1

質問デバッグヘルプ(「なぜこのコードは機能していないのですか?」)には、目的の動作、特定の問題またはエラー、および質問自体に再現するのに必要な最短コードが含まれている必要があります。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:[mcve]を作成する方法。 – GhostCat

+1

これは:**あなたの*テスト中のクラス*もコンパイルされません!これら2つの静的メソッドには**返される型**がありません。 *合理的な*ここに入力を開始することから始めよう! **あなたが何をしようとしているかを明確に説明してください。 – GhostCat

答えて

0

コードでwhen(testA.class, "orderPOST"...orderPostの方法を模擬しています。

あなただけretrieveOrderメソッドをモックとしたいと他のものを無視したい場合は、あなたのテストクラスは次のようになります。

PowerMockito.mockStatic(testA.class); 
Mockito.when(testA.retrieveOrder(Mockito.anyString())).thenReturn(order); 

@RunWith(PowerMockRunner.class) // needed for powermock to work 
// class that has static method and will be mocked must be in PrepareForTest 
@PrepareForTest({ testA.class }) 
public class MyTestClass { 

    @Test 
    public void testRetrieveOrderMethod() throws Exception { 
     // JSON object you want to return 
     JSONObject order = new JSONObject(); 
     order.put("orderId", "whatever value you want to test"); 

     PowerMockito.spy(testA.class); 
     // retrieveOrder will return order object 
     PowerMockito.doReturn(order).when(testA.class, "retrieveOrder", Mockito.anyString()); 

     // call static method 
     JSONObject retrieved = testA.retrieveOrder("12345"); 

     // do the assertions you need with retrieved 
    } 
} 

またにspydoReturnを変えることができますどちらも同じように動作します。

+0

私はテストコードを更新しましたが、私はそれを模擬した方法によって2つの異なるエラーに遭遇します。 1. PrepareForTestに含める必要はありません。 PrepareForTestにtestA.classを含めると、コードカバレッジの目的では機能しません。 2. PrepareForTestに含まれていない場合は、org.mockito.exceptions.misusing.UnfinishedStubbingException: 未完了のスタブが検出されました: ........ 3. mockStaticに変更した場合もちろん、org.powermock.api.mockito.ClassNotPreparedExceptionを取得しています。 4. Whitebox.invokeMethodのアプローチは何ですか? –

+0

静的メソッドをPowerMockitoでモックしたい場合は、 'RunWith'と' PrepareForTest'を使う必要があります(これは必須のようです(https://github.com/powermock/powermock/wiki/MockStatic))。 [PowerMockitoとコードカバレッジ](https://github.com/powermock/powermock/issues/422)のバグであり、修正されているかどうかは不明です。私はWhiteboxを使ったことがないので、うまくいくかどうかは分かりません。 –

+0

私はそれらを無視する方法を見つけることができないので、私はこれらの私的静的メソッドを実行することになります。物事は今私のために働いています。 –

関連する問題