JUnit 判断 是否有异常抛出 异常类型是否正确 以及 异常的message 是否正确

本文介绍两种在JUnit中测试预期异常的方法:使用ExpectedException规则和Assert.fail结合try-catch块。通过具体示例展示了如何验证抛出的异常类型及消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:

http://stackoverflow.com/questions/2469911/how-do-i-assert-my-exception-message-with-junit-test-annotation

http://junit-team.github.io/junit/javadoc/4.10/org/junit/rules/ExpectedException.html

http://stackoverflow.com/questions/4489801/junit-test-analysing-expected-exceptions

http://jakegoulding.com/blog/2012/09/26/be-careful-when-using-junit-expected-exceptions/


方法一:使用ExpectedException

发生以下情况时,会认为失败

  1. 没有抛出异常
  2. 抛出的异常类型不正确
  3. 抛出的异常的message不正确

package com.yasi.test;

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;

public class UnitTest {
	
	@Rule
    public ExpectedException thrown= ExpectedException.none();
	
	@Test
	public void test1() {
		thrown.expect(NumberFormatException.class);
		thrown.expectMessage("The first error");
		
		throw new NumberFormatException("The first error");
	}
	
	@Test
	public void test2() {
		thrown.expect(IndexOutOfBoundsException.class);
		thrown.expectMessage("The second error");
		
		throw new IndexOutOfBoundsException("The second error");
	}
}


注意:

这里使用的expect() 函数原型是

public void expectMessage(String substring)
即, 传入的字符串不是要求 “刚好匹配”,而是, 只要 “被包含” 就算成功


这里有个问题,thrown.expectMessage("The first error") 一行,如果期望的message内容写成 "a",总是成功,但写成 "aa" 就失败。还不知道是怎么回事……


方法二:使用junit.Assert.fail

发生以下情况时,会认为失败

  1. 没有抛出异常
  2. 抛出的异常类型不正确

这里也可以用assertEquals来判断抛出的异常的message是否正确

package com.yasi.test;

import org.junit.Test;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

public class UnitTest {
	
	@Test
	public void test3() {
		try {
			long data = Long.parseLong("???");
			fail("NumberFormatException is not thrown as expected");
		} catch (Exception e) {
			assertTrue(e instanceof NumberFormatException);
		}
	}
	
}


在单元测试中测试异常是否正确抛出是一个常见的测试场景。以下是几种常见的方法: 1. **使用JUnit的`assertThrows`方法**: JUnit 5引入了`assertThrows`方法,可以直接断言某个代码块会抛出特定的异常。 ```java import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertThrows; public class ExceptionTest { @Test public void testExceptionIsThrown() { ExceptionClass exceptionClass = new ExceptionClass(); assertThrows(ExpectedException.class, () -> { exceptionClass.methodThatThrowsException(); }); } } ``` 2. **使用JUnit的`try-catch`块**: 在JUnit 4及之前的版本中,通常使用`try-catch`块来捕获异常并断言异常的类型和消息。 ```java import org.junit.Test; import static org.junit.Assert.assertEquals; public class ExceptionTest { @Test public void testExceptionIsThrown() { ExceptionClass exceptionClass = new ExceptionClass(); try { exceptionClass.methodThatThrowsException(); // 如果没有抛出异常,测试失败 org.junit.Assert.fail("Expected exception was not thrown"); } catch (ExpectedException e) { // 断言异常类型 assertEquals(ExpectedException.class, e.getClass()); // 断言异常消息 assertEquals("Expected exception message", e.getMessage()); } } } ``` 3. **使用Mockito的`doThrow`方法**: 如果在测试中需要模拟某个方法抛出异常,可以使用Mockito的`doThrow`方法。 ```java import org.junit.Test; import static org.mockito.Mockito.*; import static org.junit.Assert.*; public class ExceptionTest { @Test public void testExceptionIsThrown() { ExceptionClass mock = mock(ExceptionClass.class); doThrow(ExpectedException.class).when(mock).methodThatThrowsException(); try { mock.methodThatThrowsException(); fail("Expected exception was not thrown"); } catch (ExpectedException e) { assertEquals(ExpectedException.class, e.getClass()); } } } ``` 这些方法可以帮助你在单元测试中验证异常是否正确抛出,从而确保代码的健壮性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值