2017-02-21 6 views
8

Привет, ребята, мне было интересно, если этот способ проверки моего исключения в порядке, у меня есть это исключение, мне нужно добавить вторую тестовую аннотацию, я получаю в результате красный злой бар и преуспеть и сбой, так как вы можете догадаться, что неудача - моя забота, у меня есть fail(); но причина в том, что я читаю, что это способ проверить исключение, и теперь я запутался.JUnit правильный способ проверки ожидаемых исключений

Также я должен сказать, что im willin получит зеленую полосу, потому что я ожидаю исключения, но я не знаю, является ли отказ правильным способом увидеть ответ ожидаемого исключения.

Кроме того, если у вас какие-либо рекомендации, я был бы признателен за это

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

ответ

7

Существует 3 наиболее распространенные способы проверить ожидаемое исключение:

Первый из них является наиболее распространенным способом, но с ним можно проверить только тип ожидаемого исключения. Этот тест потерпит неудачу, если ExceptionType не будет выброшено:

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

Кроме того, вы не можете указать сообщение об ошибке с помощью этого подхода

Лучшим вариантом является использование ExpectedException JUnit @Rule. Здесь вы можете утверждать гораздо больше ожидаемого исключения

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

Третий вариант позволит вам сделать то же самое, как с помощью ExpectedException @Rule, но все утверждения должны быть написаны вручную. Однако преимущество этого метода заключается в том, что вы можете использовать любое настраиваемое утверждение и любую необходимую библиотеку утверждений:

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

Вам не нужно, чтобы поймать Exception с try-catch

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

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

} 

Если мы предположим, что factory.createLocomotive(weirdProtocol, false, new Date()) бросает exception когда вас примените сценарий, который вызывает выброс exception.

void createLocomotive(param...) { 

    //something... 

    throw new TramaConProtolocoloDesconocido(); 
} 
2

Вы можете использовать ExpectedException, которые могут предоставить вам более точную информацию об исключении, как ожидается, будет выброшен с возможностью проверки сообщения об ошибке, как показано ниже:

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

Чтобы expolore больше об этом, вам может относиться к блогу, написанной мной здесь - Expected Exception Rule and Mocking Static Methods – JUnit

1

если ваш используете Java 8, я бы рекомендовал пойти в библиотеку AssertJ

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

    } 

с этим решением, которое вы можете на одном проверить тип исключения, с сообщением и т.д.

для более чтений, обратите внимание на: http://joel-costigliola.github.io/assertj/assertj-core-features-highlight.html#exception-assertion

+0

ЭТО отлично выглядит! но я использую Java 7, я попробую его на своем собственном проекте, чтобы проверить его! большое спасибо –

Смежные вопросы