简体   繁体   English

JUnit测试预期异常的正确方法

[英]JUnit right way of test expected exceptions

Hello guys I was wondering if this way of testing my exception is ok, i have this exception i need to throw in the second test annotation, im receiving as result a red evil bar, and a succeed and a failure, as you can guess the failure is my concern, i have a fail(); 大家好我想知道这种测试我的异常的方法是否正常,我有这个例外我需要抛出第二个测试注释,我接收结果是一个红色的邪恶吧,一个成功和一个失败,你可以猜到失败是我关心的,我有失败(); there but the reason is because i read thats the way to test the exception and now im confused. 但原因是因为我读到了测试异常的方法,现在我很困惑。

Also i have to say im willin get the green bar because im expecting the exception, but i dont know if failure is the right way to see the answer of the expected exception. 此外,我不得不说im willin得到绿色条,因为我期待异常,但我不知道失败是否是正确的方式来看到预期的异常的答案。

Also if you had any advice, I would appreciate it 如果您有任何建议,我将不胜感激

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

There is 3 most common ways to test expected exception: 测试预期异常有3种最常用的方法:

First one is the most common way, but you can test only the type of expected exception with it. 第一种方法是最常用的方法,但您只能使用它来测试预期异常的类型。 This test will fail if ExceptionType won't be thrown: 如果不抛出ExceptionType则此测试将失败:

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

Also you cannot specify the failure message using this approach 此外,您无法使用此方法指定失败消息

The better option is to use ExpectedException JUnit @Rule . 更好的选择是使用ExpectedException JUnit @Rule Here you can assert much more for expected exception 在这里,您可以为预期的异常断言更多

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

The third option will allow you to do the same as with using ExpectedException @Rule, but all the assertion should be written manually. 第三个选项将允许您执行与使用ExpectedException @Rule相同的操作,但所有断言都应手动编写。 However the advantage of this method is that you can use any custom assertion and any assertion library that you want: 但是,此方法的优点是您可以使用任何自定义断言和所需的任何断言库:

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

You can use ExpectedException which can provide you more precise information about the exception expected to be thrown with the ability to verify error message, as follows: 您可以使用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());
    }
}

To expolore more about it, you can refer to the blog written by me here - Expected Exception Rule and Mocking Static Methods – JUnit 要更多地了解它,你可以参考我在这里写的博客 - 预期的异常规则和模拟静态方法 - JUnit

if your are using java 8, I would recommend to go for the AssertJ library 如果您使用的是java 8,我建议您去AssertJ库

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

    }

with that solution you can at one verify exception type, with message etc. 使用该解决方案,您可以在一个验证异常类型,消息等。

for more reading, take a look at: http://joel-costigliola.github.io/assertj/assertj-core-features-highlight.html#exception-assertion 了解更多信息,请查看: http//joel-costigliola.github.io/assertj/assertj-core-features-highlight.html#exception-assertion

You don't need to catch the Exception with try-catch 您不需要使用try-catch Exception

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

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

}

If we suppose that factory.createLocomotive(weirdProtocol, false, new Date()) throws the exception when you apply a scenario that makes the exception thrown. 如果我们假设factory.createLocomotive(weirdProtocol, false, new Date())抛出exception ,当你申请一个场景,使exception抛出。

void createLocomotive(param...) {

    //something...

    throw new TramaConProtolocoloDesconocido();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM