2017-06-14 3 views
0

Angenommen, ich die folgenden Klasse:Java Unit Tests mit Mockito. Funktionsaufruf innerhalb einer Funktion

public class Math { 

    public int mult(int a, int b) { 
     return 4; 
    } 

    public int mul (int a, int b) { 
     return mult(a,b); 
    } 

} 

und die folgenden Testklasse:

public class TestMockito { 

    Math testMath; 

    @Before 
    public void create() { 
     testMath = *mock*(Math.class); 
     when(testMath.mult(1,2).thenReturn(2); 
    } 

    @Test 
    public void test() { 
     System.out.println(testMath.mul(1,2)); 
    } 
} 

Warum mul(1,2) in test() genannt nicht when(testMath.mult(1,2).thenReturn(2); verwenden?

Gibt es eine andere Möglichkeit, eine Methode zu verspotten, die in einer anderen Methode verwendet wird, die getestet wird?

Prost

+2

Hier 'Math' ist die zu testende Klasse. Sie sollten die Klasse, die im Test ist, nicht verspotten. – Jobin

+0

@Jobin Seltsam. Ich lernte von: https://www.youtube.com/watch?v=79eXGJ2rKZs – Anant

Antwort

2

Sie spotten in der Regel nicht den im Test befindlichen Code (es sei denn es eine abstrakte Klasse ist).

Sie verspotten normalerweise andere Klassen (die Abhängigkeiten), mit denen Ihr CUT kommuniziert.

Der Grund, warum Ihr Test nicht funktioniert (wie Sie erwarten) ist, dass der Mock kein Objekt der realen Klasse ist (weshalb wir es auch basteln ...). Es wurde von dem Mock Framework nicht abgeleitet, um sich wie der ursprüngliche Code zu verhalten, aber wie es für den Test konfiguriert wurde.

Wenn Sie wirklich wollen die wirklichen Methoden in der Mock genannt zu werden (was nicht das, was Sie wollen, ist die meiste Zeit) benötigen Sie Mockito zu sagen, dass, wenn die Mock erstellen:

mock(ClassToBeMocked.class,Mockito.CALL_REAL_METHODS);