AssertJ异常处理问题:assertThat+isInstanceOf验证失败求助
问题排查与解决方案
核心问题:异常断言方式错误
你当前用的assertThat(Application.enterTheAmount()).isInstanceOf(...)逻辑完全错误:
- 当
enterTheAmount()抛出IllegalArgumentException时,这个异常会直接中断测试方法执行,根本走不到isInstanceOf的断言步骤。 isInstanceOf是用来验证方法正常返回时的返回值类型,不是用来捕获并验证抛出的异常。
正确的AssertJ异常断言写法
用AssertJ专门的assertThatThrownBy方法来捕获并验证异常:
void validateTheEnteredAmount(){ final String INVALID_NUMBER = "1234"; InputStream in = new ByteArrayInputStream(INVALID_NUMBER.getBytes()); System.setIn(in); // 正确捕获异常并验证类型 assertThatThrownBy(() -> Application.enterTheAmount()) .isInstanceOf(IllegalArgumentException.class); }
额外语法问题修复
你的业务方法有编译错误,必须先修正:
// 错误写法:修饰符顺序颠倒 int final LOTTO_PRICE = 1000; // 正确写法:final放在类型前面 final int LOTTO_PRICE = 1000;
后续排查线索(若仍失败)
- 确认
System.setIn(in)在调用enterTheAmount()之前执行,确保输入流被正确替换。 - 在业务方法里加日志打印读取到的
amount,确认输入值确实是1234,没被其他代码覆盖。 - 检查AssertJ依赖版本,
assertThatThrownBy需要AssertJ 3.x及以上版本支持。
内容的提问来源于stack exchange,提问作者Dan Lee
相关产品推荐
相关产品推荐

