2017-08-31 3 views
-1

Im Schreibgerät Test mit Testng und Mockito. Im Normalfall ist es üblich, eine Methode einige Male innerhalb derselben Testmethode aufzurufen, indem Sie alle Szenarien mit unterschiedlichen Werten/Bedingungen überprüfen.Mockito, überprüfen Sie, dass Zeile für eine Bedingung innerhalb einer Testmethode nicht ausgeführt

Bitte denken Sie nicht über die Logik und Design, die ich zur Verfügung gestellt habe. Dies ist nur ein Beispiel für klar, was ich eigentlich machen will.

Bewertungscode unten.

public class Human { 

    private String name; 
    private boolean parent; 
    private List<Human> childs = new ArrayList<>(); 

    public String getName() { 
     return name; 
    } 

    public boolean isParent() { 
     return parent; 
    } 

    public void setParent(boolean parent) { 
     this.parent = parent; 
    } 

    public void addChild(List<Human> childs) { 
     this.childs = childs; 
    } 

    public List<Human> getChilds() { 
     return childs; 
    } 


} 

public class Validator { 
    public boolean isParent(Human human) { 
     if (null == human) { 
      return false; 
     } 
     if (human.isParent()) { 
      return true; 
     } 
     if (human.getChilds().size() > 0) { 
      return true; 
     } 
     return false; 
    } 
} 

Im Schreiben Testfall für Validator isParent-Methode mit Mockito.

public class ValidatorTest {

public void testIsParent() throws Exception { 
    Validator validator = Mockito.spy(new Validator()); 
    Human human = Mockito.mock(Human.class); 
    Mockito.when(human.isParent()).thenReturn(false); 
    boolean isParent = validator.isParent(human); 
    Mockito.verify(human).getChilds(); 

    Mockito.when(human.isParent()).thenReturn(true); 
    isParent = validator.isParent(human); 
    Mockito.verify(human).getChilds(); 


} 

Hier drin i überprüfen wollen, dass getChilds() nie für die zweite Methode Aufruf validator.isParent nennen (human), weil die menschliche Satz verspottet wahr, wenn der Anruf human.isParent zurückzukehren();

I verwendet Mockito.verifyZeroInteractions() aber es sagt scheitern Als i Mockito.verifyZeroInteractions() Prüfung durch alle Test verstehen. nicht nur für bestimmte Methodenaufruf.

Ich möchte wissen, gibt es eine Möglichkeit, diese Methode zu überprüfen, ist nicht Aufruf für einige Fälle und Methodenaufruf für gleiche Fälle innerhalb derselben Testmethode. Oder sollte ich Test 1 Szenario in einer Testmethode üben.

+0

1 Szenario pro Testmethode. 1. Du prüfst, ob ein Mensch Eltern ist und treue zurück und deine 2. Testmethode sollte das Gegenteil sein – XtremeBaumer

Antwort

0

Es ist eine gute Praxis zu haben, „ein Szenario pro eine Testmethode“ (siehe How many unit tests should I write per function/method?)

Technisch ist es noch möglich ist Mocks mit Mockito.reset(...) zurückgesetzt, aber das, was offizielle Dokumentation sagt über sie:

Smart Mockito-Benutzer verwenden diese Funktion kaum, weil sie wissen, dass dies ein Zeichen für schlechte Tests sein kann. Normalerweise müssen Sie Ihre Mocks nicht zurücksetzen, sondern nur neue Mocks für jede Testmethode erstellen.

Anstelle von reset() sollten Sie einfache, kleine und fokussierte Testmethoden über lange, überspezifizierte Tests schreiben. Der erste potentielle Code-Geruch ist reset() in der Mitte der Testmethode. Dies bedeutet wahrscheinlich, dass Sie zu viel testen. Folgen Sie dem Flüstern Ihrer Testmethoden: "Bitte halten Sie uns klein & konzentrierte sich auf einzelnes Verhalten".

Siehe https://static.javadoc.io/org.mockito/mockito-core/2.9.0/org/mockito/Mockito.html#17

+0

Danke für die Antwort und den Rat. hier habe ich mockito.reset benutzt und versucht Mockito.verifyZeroInteractions(). aber es fällt. –

+0

Mockito sagt auch, dass Wertobjekte ('Mensch') * nicht * verspottet werden sollten. Auch * teilweise * Spott ("Spione") sind mit Argwohn zu sehen. –

-1

Verfahren überprüfen kann ein zweites Argument akzeptieren, wo Sie können festlegen, wie oft die Methode aufgerufen wurde. Sie können dies verwenden, um zu sagen, dass die Methode nie aufgerufen wurde, einmal, zweimal usw.

Zum Beispiel:

import static org.mockito.Mockito.never; 

... 

public void testIsParent() throws Exception { 
    Validator validator = Mockito.spy(new Validator()); 
    Human human = Mockito.mock(Human.class); 
    Mockito.when(human.isParent()).thenReturn(false); 
    boolean isParent = validator.isParent(human); 
    Mockito.verify(human).getChilds(); 

    Mockito.when(human.isParent()).thenReturn(true); 
    isParent = validator.isParent(human); 
    Mockito.verify(human, never()).getChilds(); 

} 

Die Dokumentation hierfür ist hier: http://static.javadoc.io/org.mockito/mockito-core/2.9.0/org/mockito/Mockito.html#4

+0

Es gibt Fehler Nie wollte hier: -> um {class} Aber hier aufgerufen: –

+0

@ChamlyIdunil das wäre, weil die Methode aufgerufen wird ?! – robjwilkins

+0

Warum sollte jemand solch einen schrecklichen Test schreiben, wenn er viel sauberer und ohne Mocks sein kann, während er auch dem Rat von Mockito selbst folgt [wie man gute Tests schreibt] (https://github.com/mockito/mockito/wiki/Wie schreibt man gute Tests? –

-1

ich, dass diese Frage ernsthaft Mißbräuche spöttisch darauf hin will, für etwas zu testen, die einfach und sauber ohne zu prüfen Spott.

Diese ist es, was die Tests sollte folgendermaßen aussehen:

public class ValidatorTest { 
    final Validator sut = new Validator(); 

    @Test 
    public void checkThatNoHumanIsNotAParent() { 
     boolean isParent = sut.isParent(null); 

     assertFalse(isParent); 
    } 

    @Test 
    public void checkHumanThatIsNotAParent() { 
     Human notAParent = new Human(); 

     boolean isParent = sut.isParent(notAParent); 

     assertFalse(isParent); 
    } 

    @Test 
    public void checkParentHumanWithNoChildIsAParent() { 
     Human parentWithNoChildren = new Human(); 
     parentWithNoChildren.setParent(true); 

     boolean isParent = sut.isParent(parentWithNoChildren); 

     assertTrue(isParent); 
    } 

    @Test 
    public void checkHumanNotMarkedAsParentButWithChildIsAParent() { 
     Human humanWithChildren = new Human(); 
     Human child = new Human(); 
     humanWithChildren.addChild(child); 

     boolean isParent = sut.isParent(humanWithChildren); 

     assertTrue(isParent); 
    } 
} 

Diese Tests completelly alle vier Szenarien trainieren. Sie sind eindeutig viel besser als eine Version, die Spott verwendet. Beachten Sie schließlich, dass Mockitos Dokumentation (auf der Seite, wie man gute Tests schreibt) auch besagt, dass Wertobjekte (wie Human) nicht verspottet werden sollten.

+1

Die Frage sagt eindeutig, dass dies ein Beispiel ist, kein echter Code. –

+0

@MaximPonomarev Dann sollte es ein Beispiel zeigen, wo die Verwendung von Spott eigentlich Sinn macht ... –

Verwandte Themen