2017-03-02 4 views
1

私はUtilsクラスをテストしようとしています。いくつかのメソッドは他のクラスメソッドを使用します。私はテストが彼らが(特定の方法をテストする実際のユニットテストにするために)動作すると仮定するように、内部メソッドを嘲笑したい。メソッドの中のMockito - テストメソッド

私は 'buildUrl' メソッドをテストしたい:

public static String buildUrl(String path, List<Pair> queryParams, DateFormat dateFormat) { 
    final StringBuilder url = new StringBuilder(); 
    url.append(path); 

    if (queryParams != null && !queryParams.isEmpty()) { 
     // support (constant) query string in `path`, e.g. "/posts?draft=1" 
     String prefix = path.contains("?") ? "&" : "?"; 
     for (Pair param : queryParams) { 
      if (param.getValue() != null) { 
       if (prefix != null) { 
        url.append(prefix); 
        prefix = null; 
       } else { 
        url.append("&"); 
       } 
       String value = Utils.parameterToString(param.getValue(), dateFormat); 
       url.append(Utils.escapeString(param.getName())).append("=").append(Utils.escapeString(value)); 
      } 
     } 
    } 

    return url.toString(); 
} 

BuildUrlは、私がテスト用にモックとしたい 'parameterToString'(およびその他)を使用します。だから私はこのような何か試してみました:

@Test 
public void testBuildUrl(){ 
    Utils util = new Utils(); 
    Utils utilSpy = Mockito.spy(util); 
    Mockito.when(utilSpy.parameterToString("value1",new RFC3339DateFormat())).thenReturn("value1"); 
    List<Pair> queryParams = new ArrayList<Pair>(); 
    queryParams.add(new Pair("key1","value1")); 
    String myUrl = utilSpy.buildUrl("this/is/my/path", queryParams, new RFC3339DateFormat()); 
    assertEquals("this/is/my/path?key1=value1&key2=value2", myUrl); 
} 

をしかし、私はMockitoからMissingMethodInvocationExceptionを取得しています。 私の質問は実際には - テストされたメソッドの中で呼び出されたメソッドを模擬する方法と私のテストで何が問題なのかです。ありがとう。

答えて

0

標準のMockitoを使用して静的な呼び出しをモック/スパイすることはできません。

あなたは以下にPowermockitoと何かを使用する必要があります。ここでは

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Utils.class)  
public class MyClassTest{ 

    @Test 
    public void testBuildUrl(){ 
     PowerMockito.mockStatic(Utils.class); 

     // mock the static method to return certain values 
     Mockito.when(Utils.parameterToString("value1",new RFC3339DateFormat())) 
      .thenReturn("value1"); 
     Mockito.when(Utils.escapeString(anyString()).thenReturn(desiredResult); 

     // rest of test code 
    } 

を通読するためにいくつかのより多くの原料である - >powermockito static

0

私は内部メソッドを使用モックとしたいので、テストはそれらが動作すると仮定します(実際のユニットテスト、特定のメソッドをテストするために)。

ユニットテストではないテスト具体的な方法ください。

UnitTestsテスト被験コードの公開観察可能な動作


この方法のいくつかを模倣する必要があると感じる場合は、デザインが改善する必要があるという兆候となります。ユーティリティメソッドstaticを作成する必要はありません。また、テスト対象のクラスは多くの責任を負う必要があります。

原因のPowerMockは、テストでの問題を克服しますが、IMHOの使用は悪い設計に降伏します。

関連する問題