2017-10-11 3 views
0

Klasse unter Test spöttisch:Mockito den Wert einer Methode

class FruitQuality { 

    void testQuality() { 
    getfruits(); 
    //some code 
    } 

    List<Fruits> getfruits() { 
    return orange; 
    } 
} 

Unten ist der Testcode. Ich verspottete die zu testende Klasse und übersteuerte einen Rückgabewert für die Methode getfruits. Aber wenn ich den Mock ausführe, bekomme ich nicht den erwarteten verspotteten Rückgabewert. Easymock kann Rückgabewerte für Methoden der zu testenden Klasse ersetzen, wenn diese ausdrücklich gemockt werden. Wie kann ich den verspotteten Rückgabewert erhalten, wenn ich die reale Objektmethode vortäusche?

@Test 
public void test() { 
    Fruits fruit= new Fruits(); 
    fruit.setFruit("orange"); 
    List<Fruits> fruitsList = new ArrayList<Fruits>(); 
    fruitsList.add(fruit); 

    Fruits mock = Mockito.mock(FruitQuality.class) 
    classUnderTest = new FruitQuality(); 
    when(mock.getfruits()).thenReturn(fruitsList); 

    result= classUnderTest.getfruits(); 
    assertEquals(result, fruitsList); 
} 
+0

ist unser assertEquals korrekt? Es ruft nach 'result', aber es gibt keine Variable 'result'. – schneida

+2

Warum verspotten Sie die getestete Klasse? Üblicherweise spottet man die Abhängigkeiten der zu testenden Klasse –

+1

Bitte stellen Sie sicher, dass Ihr Code etwas echten Java-Code ist, Ihre 'getfruits()' Methode liefert zwei Werte mit zwei 'return' Anweisungen. Das gibt es in Java nicht ... – schneida

Antwort

0

Normalerweise, wenn Unit-Tests zu schreiben, müssen Sie eine Klasse unter Test, um den Implementierungscode enthält, den Sie testen, während die Methode von anderen Klassen Klasse unter Test verspotten setzt auf.

refering zu Ihrem Beispiel würden Sie eine Klasse

public class FruitQuality { 
    private FruitProvider fruitProvider; 

    public List<Fruit> testQuality() { 
     List<Fruit> fruits = fruitProvider.getfruits(); 
     /* Some code doing something with fruits, e.g., filtering. */ 
     return fruits; 
    } 
} 

und eine zweite Klasse

public class FruitProvider { 
    public List<Fruits> getfruits() { 
     /* Returning some fruits ... */ 
    } 
} 

Nun könnten Sie Ihre Provider verspotten Ihre Klasse unter Test zu testen:

@RunWith(MockitoJUnitRunner.class) 
public class FruitQualityUnitTest { 
    @InjectMocks 
    private FruitQuality fruitQuality; 
    @Mock 
    private FruitProvider fruitProvider; 

    @Test 
    public void testQuality() { 
     /* Mocking the provider. */ 
     Fruits fruit= new Fruits(); 
     fruit.setFruit("orange"); 
     List<Fruits> fruitsList = new ArrayList<Fruits>(); 
     fruitsList.add(fruit); 
     when(fruitProvider.getFruits()).thenReturn(fruitsList); 

     /* Invoke the method under test. */ 
     List<Fruits> result = fruitProvider.testQuality(); 

     /* Assert that some methods where called. */ 
     verify(fruitProvider, times(1)).getFruits(); 

     /* If the method would return a value, you can do some assertions based on the mocked method calls. */ 
     assertEquals(result, fruitsList); 
    } 
} 

Wenn Sie die Methoden desselben Objekts, das Sie verspotten, testen möchten, können Sie stattdessen die @Spy-Annotation verwenden. O f @Mock, versicherend, dass nur Methoden Sie ausdrücklich spotten, andere Dinge als die ursprüngliche Implementierung zu tun.

Verwandte Themen