2017-02-21 5 views
8

Hallo Leute Ich fragte mich, ob diese Art der Prüfung meiner Ausnahme ist in Ordnung, ich habe diese Ausnahme, die ich in der zweiten Test Annotation werfen muss, im als Ergebnis erhalten eine rote böse Bar und a Erfolg und ein Fehler, wie Sie den Fehler erraten können, ist meine Sorge, ich habe eine fail(); da aber der Grund ist, weil ich lese das ist der Weg, um die Ausnahme zu testen und jetzt bin ich verwirrt.JUnit richtigen Weg des Tests erwartete Ausnahmen

Auch ich muss sagen, dass ich den grünen Balken bekomme, weil ich die Ausnahme erwarte, aber ich weiß nicht, ob der Fehler der richtige Weg ist, die Antwort der erwarteten Ausnahme zu sehen. wenn Sie einen Rat hätte, würde ich es zu schätzen wissen

Auch

@Before 
    public void setUp() throws Exception { 
     LogPack.logPacConfig(Constants.LOGGING_FILE); 
     gtfri = "+RESP:GTFRI,380502,869606020101881,INCOFER-gv65,,10,1,1,0.0,0,888.1,-84.194560,9.955602,20170220074514,,,,,,0.0,,,,100,210100,,,,20170220074517,40A2$"; 
     weirdProtocol = "+RESP:GRI,380502,869606020101881,INCOFER-gv65,,10,1,1,0.0,0,888.1,-84.194560,9.955602,20170220074514,,,,,,0.0,,,,100,210100,,,,20170220074517,40A2$"; 
     factory = new LocomotiveFactory(); 
    } 
    @Test 
    public void GTFRICreationTester_shouldPass() throws TramaConProtolocoloDesconocido { 
     assertTrue(factory.createLocomotive(gtfri, false, new Date()) instanceof LocomotiveGTFRI); 
    } 

    @Test(expected = TramaConProtolocoloDesconocido.class) 
    public void GTFRICreationTester_shouldFail() { 
     try { 
      factory.createLocomotive(weirdProtocol, false, new Date()); 
      fail("Expected an TramaConProtolocoloDesconocido"); 
     } catch (TramaConProtolocoloDesconocido e) { 
      //assertSame("exception thrown as expected", "no se conoce el protocolo dado para la creacion de este factory", e.getMessage());; 
     } 
    } 

Antwort

7

Es 3 häufigsten Arten, erwartet Ausnahme zu testen:

Die erste ist der gebräuchlichste Weg, aber Sie können nur den Typ der erwarteten Ausnahme damit testen. Dieser Test wird fehlschlagen, wenn ExceptionType nicht geworfen werden:

@Test(expected = ExceptionType.class) 
public void testSomething(){ 
    sut.doSomething(); 
} 

Auch können Sie die Fehlermeldung angeben, mit diesem Ansatz

Die bessere Option ist ExpectedException JUnit @Rule zu verwenden. Hier können Sie behaupten, viel mehr für die erwartete Ausnahme

@Rule 
public ExpectedException thrown = ExpectedException.none(); 

@Test 
public void testSomething(){ 
    thrown.expect(ExceptionType.class); 
    thrown.expectMessage("Error message"); 
    thrown.expectCause(is(new CauseOfExeption())); 
    thrown.reportMissingExceptionWithMessage("Exception expected"); 
    //any other expectations 
    sut.doSomething(); 
} 

Die dritte Option können Sie das gleiche wie bei der Verwendung von ExpectedException @Rule tun, aber alle die Behauptung sollte manuell geschrieben werden. Der Vorteil dieser Methode besteht jedoch darin, dass Sie jede benutzerdefinierte Assertion und jede Assertion-Bibliothek verwenden können, die Sie möchten:

@Test 
public void testSomething(){ 
    try{ 
     sut.doSomething(); 
     fail("Expected exception"); 
    } catch(ExceptionType e) { 
    //assert ExceptionType e 
    } 
} 
2

Sie nicht fangen müssen, um die Exception mit try-catch

@Test(expected = TramaConProtolocoloDesconocido.class) 
public void GTFRICreationTester_shouldFail() { 

    factory.createLocomotive(weirdProtocol, false, new Date()); 

} 

Wenn wir annehmen, dass factory.createLocomotive(weirdProtocol, false, new Date()) die exception wirft, wenn Sie Wenden Sie ein Szenario an, das exception ausgelöst wird.

void createLocomotive(param...) { 

    //something... 

    throw new TramaConProtolocoloDesconocido(); 
} 
2

können Sie ExpectedException verwenden, die Sie genauere Informationen über die Ausnahme zur Verfügung stellen kann erwartet mit der Fähigkeit geworfen werden Fehlermeldung, um zu überprüfen, wie folgt:

import org.junit.Rule; 
import org.junit.Test; 
import org.junit.rules.ExpectedException; 
import org.junit.runner.RunWith; 
public class TestClass { 

    @Rule 
    public ExpectedException expectedException = ExpectedException.none(); 


    @Test 
    public void GTFRICreationTester_shouldFail() { 
     expectedException.expect(TramaConProtolocoloDesconocido.class); 
     factory.createLocomotive(weirdProtocol, false, new Date()); 
    } 
} 

Um mehr expolore darüber, Sie beziehen kann mich auf den Blog hier geschrieben - Expected Exception Rule and Mocking Static Methods – JUnit

1

wenn Ihr verwenden Java 8, würde ich für die AssertJ Bibliothek

01 zu gehen, empfehlen

mit dieser Lösung, die Sie bei einer Ausnahmetyp überprüfen können, mit der Meldung usw.

für mehr lesen, werfen Sie einen Blick auf: http://joel-costigliola.github.io/assertj/assertj-core-features-highlight.html#exception-assertion

+0

Das sieht gut aus! aber wenn ich Java 7 benutze, werde ich es auf einem eigenen Projekt versuchen, um es zu überprüfen! Danke vielmals –