2017-03-02 1 views
1

Ich versuche, meine Utils-Klasse zu testen. Einige der Methoden verwenden andere Klassenmethoden. Ich möchte den internen Methodengebrauch verspotten, damit der Test davon ausgeht, dass sie funktionieren (um es zu einem echten Unit Test zu machen, der die spezifische Methode testet).Mockito - Testmethode in einem Netz

Ich will 'buildUrl' testen Methode:

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 verwendet 'parameterToString' (und andere), die ich für den Test verspotten wollen. Also habe ich versucht, so etwas wie dieses:

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

Aber ich bin immer MissingMethodInvocationException von Mockito. Also meine Frage ist eigentlich - wie man eine Methode vortäuscht, die innerhalb der getesteten Methode aufgerufen wurde, und was ist falsch mit meinem Test. Vielen Dank.

Antwort

0

Sie können statische Aufrufe mit Standard Mockito nicht simulieren/spionieren.

Sie haben Powermockito und etwas auf die folgende verwenden:

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

hier etwas mehr Material durch lesen ->powermockito static

0

ich die internen Methoden verspotten wollen verwenden, damit die Test wird davon ausgehen, dass sie funktionieren (um es zu einem echten Unit-Test zu machen, der die spezifische Methode testet).

Unittests tun nicht Test spezifische Methode s.

UnitTests Test öffentliches beobachtbares Verhalten des zu testenden Codes.

Wenn Sie glauben, dass Sie einige der Methoden verspotten sollten, könnte dies ein Zeichen dafür sein, dass Ihr Design verbessert werden muss. Es gibt keine Notwendigkeit, Hilfsmethoden zu machen static und vielleicht Ihre Klasse unter Test hat zu viel Verantwortung.

Aus Gründen PowerMock wird die Probleme in Ihrem Test zu überwinden, aber IMHO die Verwendung von PowerMock ist eine Hingabe an schlechtes Design.