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

2022-09-02 03:31:58

大家好,我想知道这种测试我的异常的方式是否正常,我有这个异常,我需要在第二个测试注释中投入,im收到一个红色的邪恶条,以及一个成功和失败,因为你可以猜到失败是我关心的,我有一个失败();但原因是因为我读到这是测试异常的方法,现在我很困惑。

另外,我不得不说,我愿意得到绿色的条,因为我期待异常,但我不知道失败是否是看到预期异常答案的正确方法。

另外,如果您有任何建议,我将不胜感激

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

答案 1

有 3 种最常用的方法来测试预期的异常:

第一种是最常见的方法,但您只能用它来测试预期的异常类型。如果不抛出,则此测试将失败:ExceptionType

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

此外,您不能使用此方法指定失败消息

更好的选择是使用Exedition 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();
}

第三个选项将允许您执行与使用ExpectException相同的操作@Rule,但所有断言都应手动编写。但是,此方法的优点是可以使用所需的任何自定义断言和任何断言库:

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

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

为了了解更多有关它的信息,您可以参考我在这里写的博客 - 预期的异常规则和模拟静态方法 - JUnit


推荐