Vorwort
In diesem Artikel werden Springboot+Junit+Mockito für Unit -Tests verwendet und eine Klasse ausgewählt, die Transaktionen für die Durchführung von Unit -Tests entspricht.
Verstehen Sie die Anforderungen vor der Einheitsprüfung
Um einen guten Einzeltest zu schreiben, müssen Sie zunächst die Anforderungen verstehen. Nur wenn Sie wissen, was zu tun ist, können Sie wissen, wie man testet. In diesem Artikel geht es jedoch hauptsächlich über die Verwendung von Mockito aus, und es besteht keine Notwendigkeit, auf bestimmte Bedürfnisse zu achten. Daher lässt dieser Abschnitt die spezifische Anforderungen Beschreibung aus.
Externe Abhängigkeiten isolieren
Fall1. So steuern Sie den Rückgabewert des von @autowired oder @Resource Annotation in der getesteten Klasse kommentierten Abhängigkeitsobjekts
Nehmen Sie den Matching (Matchingorder Buyorder, Matchingorder Sellorder) der untersuchten Methode als Beispiel
Getestete Klassen -MatchingsserviceImpl
public class matchingServiceImpl implementiert matchingsservice {private statische logger logger log = loggerfactory.getLogger (MatchingServiceImpl.class); @Autowired Private Quoteservice Quoteservice; ... public MatchingResult -Matching (Matchingorder Buyorder, Matchingorder Sellorder) {int CurrentPrice = quotService.getCurrentPricByProduct (buyorder.getProductCode ()); MatchingResult -Ergebnis = new MatchingResult (); if (SellOrder! = Null && Buyorder!Quoteservice.getCurrentPricByProduct (buyorder.getProductCode ()); Um auf Redis zuzugreifen, um das aktuelle Zitat zu erhalten, müssen wir den externen Abhängigkeits -Quoteservice verspotten, um den Rückgabewert der GetCurrentPricByProduct -Methode zu steuern. Sie können es mit Mockito wie folgt tun:
Testklassen -MatchingServiceImPletest
public class MatchingServiceImPlTest erweitert motitObasedTest { / *** Objekte, die von @Mock gekennzeichnet sind, werden automatisch in das von @injectMocks gekennzeichnete Objekt injiziert. /** * <pre> * Die zu testenden Objekte, markiert mit @injectMocks, werden diese von @Mock gekennzeichneten Objekte automatisch in sie injiziert. * Ein weiterer Punkt ist, dass der MatchingsserviceImpl direkt neu ist (es ist in Ordnung, wenn es nach Mockito 1.9 nicht neu ist), anstatt durch den Federbehälter injiziert zu werden. Denn hier muss ich keine anderen Abhängigkeiten vom Frühlingscontainer *erhalten, und ich brauche keine Datenbank, Redis, Zookeeper, MQ und nichts hängt davon ab, also habe ich direkt neu *</ pre> */ @injectMocks private matchingService -MatchingService = New MatchingServiceImPL (); @Test public void testMatching_successWencurrentPricebetweenbuyPriceEndsEndsEndsEldrice () {Matchingorder Buyorder = new Matchingorder (); buyorder.setPrice (1000); buyorder.setCount (23); MatchingOrder Sellorder = new MatchingOrder (); SellOrder.SetPrice (800); Sellorder.SetCount (20); // Methode Stubbing (Methode Stubbing) // wenn (x) .thenReturn (y): Gibt den angegebenen Wert zurück, wenn die angegebene Methode Mockito genannt wird. MatchingResult -Ergebnis = Matchingsservice.Matching (Buyorder, Sellorder); org.junit.assert.asserTequals (true, result.issuccess ()); // Behauptet, ob das Matchmaking erfolgreich ist. // Behauptet, ob das neueste Angebot die Erwartungen erfüllt}Fall2. Wie können Sie den Rückgabewert der Funktion B in der untersuchten Klasse A kontrollieren, wenn die Funktion A getestet wird?
Beispielsweise gibt es eine Funktion startbuyProcess in MatchingsserviceImpl, die andere Funktionen in der Klasse aufruft, wie GetTOpSellorder und Matching. Wie kontrollieren Sie die Rückgabewerte dieser beiden Funktionen?
Das Problem, das hier gelöst werden muss, ist tatsächlich, wie die gemessene Methode (z. B. StartbuyProcess) einer Klasse "Partial Mock" getestet wird, während andere Methoden (z.
Getestete Klassen -MatchingsserviceImpl
Protected void startbuyProcess (Matchingorder Buyorder, Boolean WaitFormatching) {while (true) {// Der beste Preis für den Gegenpartei Matchingorder Topsellorder = GettOpsellorder (buyorder.getProductCode ()); MatchingResult MatchingResult = Matching (Buyorder, Topsellorder); if (matchingResult.ISSUCCESS ()) {DOMATCHINGSUCCESS (Buyorder, Topsellorder, MatchingResult, MatchingType.buy); if (buyorder.getCount () <= 0) {break; }} else {if (WaitFormatching) {// add, um mit der Warteschlange übereinzustimmen, die mit AddTomatchingBuy (Buyorder) übereinstimmt. } else {// Die Bestellung sendCanclemsg (Buyorder) widerrufen; } brechen; }}}}Die Verwendung von Mockito.spy () kann "Teilmessung" erreichen.
Test Class MatchingServiceImPlTest.TestStartBuyProcess_incaseofMatchingSuccess
/** * * Testen Sie, ob die Verarbeitung der StartbuyProcess -Methode nach erfolgreichem Matchmaker die Erwartungen erfüllt, dh das Verhalten nach dem folgenden Urteilszweig * {@link MatchingServiceImpl#startbuyProcess (Matchingorder, Boolean)} * * <pre> * if (MatchingResult.ISSUCTSURDE (MACKING.ISSUCT) {) { * * * * * * * * * - * * * * Domatchinuccess (uundingResult. MatchingType.buy); * * if (buyorder.getCount () <= 0) { * break; *} *} * </ pre> * */ @test public void testStartBuyProcess_incaseofMatchingSuccess () {Matchingorder Buyorder = new Matchingorder (); buyorder.setPrice (700); buyorder.setCount (23); // Verwenden Sie Mockito.spy (), um den MatchingService -Matchingsservice = Mockito.spy (MatchingService) teilweise zu kolieren; MatchingResult FirstMatchingResult = new MatchingResult (); FirstMatchingResult.setSuSccess (true); FirstMatchingResult.settradeCount (20); MatchingResult SecondMatchingResult = new MatchingResult (); SecondMatchingResult.setSuSccess (Falsch); // Doreturn (x) .Wenn (OBJ) .Method () Nach dem Stapeln der Methoden wird das Programm nach der Ausführung dieser Methoden den angegebenen Wert wie erwartet zurückgeben. Die nicht gestapelten Methoden werden in Echtzeit ausgeführt. // Zwei Doreturns bedeuten, dass FirstMatchingResult zurückgegeben wird, wenn matchingService.matching zuerst aufgerufen wird, und SecondMatchingResult wird zurückgegeben, wenn der zweite Anruf aufgerufen wird //, da in StartBuyProcess eine Weile -Schleife vorhanden ist, kann die Matching -Methode mehrfach ausgeführt werden. Mockito.Doreturn (FirstMatchingResult) .Doreturn (SecondMatchingResult) .Wen (MatchingService) .Matching (mockito.any (matchingorder.class), Mockito.any (Matchingorder.Class)); MatchingOrder Sellorder = new MatchingOrder (); SellOrder.SetPrice (600); Sellorder.SetCount (20); // Die Gettopellorder -Methode Mockito.Doreturn (SellOrder) .When (MatchingService) .gettopellorder (Mockito.anyString ()); // Die externe Methode häufen, die von Jedis Mockito abhängt. // startbuyProcess ist die zu testende Funktion. Wenn Sie sich nicht stapeln, matchingsservice.startBuyProcess (Buyorder, True); // Die nachfolgende Überprüfungssumme besteht darin, das Verhalten der DomatchingSuccess -Methode zu testen. Dies ist auch der Zweck dieses Tests. Hier ist zu prüfen, ob Jedisclient.zremfirst einmal Mockito.Verify (Jedisclient, Mockito.times (1)) ausgeführt wurde. Zremfirst (Mockito.anyString ()); org.junit.assert.asserTequals (3, buyorder.getCount ()); org.junit.assert.asserTequals (0, sellorder.getCount ()); } Die Verwendung von Spion wurde demonstriert. Sprechen wir über die "Granularität" von Unit -Tests aus TestStartBuyProcess_incaseofMatchingSuccess.
Der Zweck von TestStartBuyProcess_incaseofMatchingSuccess besteht darin, DomatchingSuccess zu testen. Wir haben sehr hart gearbeitet, um die vorherigen Vorbereitungen zu beenden, bevor wir Domatchingsuccess testen können.
Eine bessere Praxis sollte darin bestehen, eine neue Testmethode zu starten, um Domatchinguccess separat zu testen, und der Fokus ist ebenfalls konzentriert. Nachdem Domatchingsuccess überschrieben wurde, kann StartBuyProcess tatsächlich eine eigene Urteilszweig abdecken. Die Abdeckung wird noch erreicht und der Testcode ist leichter zu warten. testStartBuyProcess_incaseofMatchIntsuccess ist aufgrund von zu vielen berücksichtigten Verantwortlichkeiten leicht durch Änderungen zu beeinflussen. Kleine Dinge ändern sich möglicherweise auf die normale Funktion.
Einführung der Test -Framework -Abhängigkeiten von Maven
<De vorhöhe> <gruppe> junit </GroupId> <artifactId> junit </artifactId> <version> 4.11 </Version> <Scope> test </scope> </abhängig> <depeaponcy> <GroupID> org.mockito </GroupId> <artifactID> Mockito-All </artifactid> </cresce> </artifactID> </artifactID> </cromigId> </artifacti-use <Scope> test </scope> </abhängig> <depeencing> <gruppe> org.springFramework </Groupid> <artifactId> Spring-Test </artifactid> <version> 4.2.5
Kontextkonstruktion von Springboot+Junit+Mockito
MockitobasedTest
@Runwith (SpringJunit4ClASSrunner.class) @SpringApplicationConfiguration (classes = testApplication.class) public abstract Class MockitoBasedTest {@before public void setup () Ausnahme {// Initialisieren Sie alle Mock -Objekte, die durch Mockito -Annotierungen annotiert sind. }} // andere Testklassen erben motitobasedTest Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.