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

新手上路,请多包涵

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

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

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

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

原文由 Daniel Vega 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 899
2 个回答

有 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
    }
}

原文由 Sergii Bishyr 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用 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

原文由 Arpit Aggarwal 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题