2017-02-21 38 views
8

Witajcie, zastanawiałem się, czy ten sposób testowania mojego wyjątku jest w porządku, mam ten wyjątek, muszę wrzucić drugą adnotację testową, otrzymuję w rezultacie czerwony pasek zła i Sukces i niepowodzenie, jak można się domyślić, że porażka jest moją obawą, mam błąd(); ale powodem jest to, że przeczytałem, że jest to sposób na sprawdzenie wyjątku, a teraz jestem zdezorientowany.JUnit właściwy sposób testowania wyjątków oczekiwanych

Muszę również powiedzieć, że chcę uzyskać zielony pasek, ponieważ oczekuję wyjątku, ale nie wiem, czy niepowodzenie jest właściwą metodą wyświetlenia odpowiedzi na oczekiwany wyjątek.

Także jeśli miał jakieś rady, chciałbym docenić to

@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());; 
     } 
    } 

Odpowiedz

7

Jest 3 najczęstsze sposoby testowania oczekiwanej wyjątek:

Pierwsza z nich jest najczęstszą metodą, ale można przetestować z nią tylko typ oczekiwanego wyjątku. Ten test nie powiedzie się, jeśli ExceptionType nie zostanie wyrzucony:

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

Również nie można określić komunikat awarii za pomocą tego podejścia

Lepszym rozwiązaniem jest użycie ExpectedException JUnit @Rule. Tutaj można twierdzić, znacznie bardziej dla oczekiwanego wyjątkiem

@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(); 
} 

Trzecia opcja pozwoli Ci zrobić to samo jak z użyciem ExpectedException @Rule, ale twierdzenie, powinno być napisane ręcznie. Jednak zaletą tej metody jest to, że możesz użyć dowolnej niestandardowej asercji i dowolnej biblioteki asercji, które chcesz:

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

Nie trzeba złapać Exception z try-catch

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

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

} 

Jeśli założymy, że factory.createLocomotive(weirdProtocol, false, new Date()) rzuca exception kiedy zastosuj scenariusz, który powoduje wygenerowanie exception.

void createLocomotive(param...) { 

    //something... 

    throw new TramaConProtolocoloDesconocido(); 
} 
2

Można użyć ExpectedException który może zapewnić Ci bardziej precyzyjne informacje o wyjątku oczekiwanego być wyrzucony z możliwością sprawdzenia komunikat o błędzie, jak następuje:

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()); 
    } 
} 

Aby expolore więcej o tym, ty może odnosić się do blogu napisane przeze mnie tutaj - Expected Exception Rule and Mocking Static Methods – JUnit

1

jeśli używasz Java 8, polecam, aby przejść do biblioteki AssertJ

public void GTFRICreationTester_shouldFail() { 
    assertThatExceptionOfType(EXCEPTION_CLASS).isThrownBy(() -> { factory.createLocomotive(weirdProtocol, false, new Date()) }) 
               .withMessage("MESSAGE") 
               .withMessageContaining("MESSAGE_CONTAINING") 
               .withNoCause();   

    } 

z tego rozwiązania można w jednym zweryfikować typ wyjątku, z wiadomości itp

uzyskać więcej czytania, przyjrzeć: http://joel-costigliola.github.io/assertj/assertj-core-features-highlight.html#exception-assertion

+0

Wygląda świetnie! ale używając Java 7, spróbuję tego na własnym projekcie, aby to sprawdzić! wielkie dzięki –