JUnit测试抛异常函数遇问题:自定义UnknownVehicleException咨询
JUnit测试自定义异常的踩坑解决指南
嘿,看你描述的情况,应该是在JUnit里验证UnknownVehicleException抛出的时候遇到问题了吧?我来给你捋几个常见的坑和解决办法,都是实际踩过的经验:
1. 选对JUnit捕获异常的方式
不同版本的JUnit写法不一样,别搞混了:
- JUnit 4:直接在
@Test注解里指定要捕获的异常类型就行,简单直接:
@Test(expected = UnknownVehicleException.class) public void testRentUnknownVehicle() throws UnknownVehicleException { RentalAgency agency = new RentalAgency(); // 这里调用会触发异常的方法,比如租一辆不存在的车 agency.rentVehicle("invalid-id", new Customer()); }
- JUnit 5(Jupiter):更推荐用
assertThrows,不仅能捕获异常,还能对异常做额外验证,灵活性更高:
@Test void testRentUnknownVehicle() { RentalAgency agency = new RentalAgency(); // 捕获异常并赋值给变量 UnknownVehicleException caughtException = assertThrows(UnknownVehicleException.class, () -> { agency.rentVehicle("invalid-id", new Customer()); }); // 要是你后面改了异常的消息,还能这么验证 // assertEquals("Vehicule not found in agency", caughtException.getMessage()); }
2. 先修复你的自定义异常写法
你现在的UnknownVehicleException构造函数用了System.out.println,这其实是个小误区!异常的正确打开方式是通过super()传递错误消息,而不是直接打印到控制台。改成这样更规范,也方便后续测试验证:
package rental; public class UnknownVehicleException extends Exception{ public UnknownVehicleException(){ super("Vehicule not found in agency"); } }
这样异常的信息会被框架正确管理,不会在测试时乱输出无关内容,还能让你在测试里断言消息是否正确。
3. 确认你的业务方法真的抛出了异常
这是最容易忽略的点!你得检查RentalAgency里的目标方法(比如rentVehicle),是不是在条件满足时明确抛出了异常,而不是只打印了一句话就完事了。比如:
// 错误示例:只打印不抛异常,JUnit肯定捕获不到 public void rentVehicle(String vehicleId, Customer customer) { Vehicle target = findVehicle(vehicleId); if (target == null) { System.out.println("Vehicule not found in agency"); // 这里少了throw语句! } } // 正确示例:抛出异常,JUnit才能捕获到 public void rentVehicle(String vehicleId, Customer customer) throws UnknownVehicleException { Vehicle target = findVehicle(vehicleId); if (target == null) { throw new UnknownVehicleException(); } // 后续的租赁逻辑 }
按照这几点排查下来,应该就能解决你的问题啦!
内容的提问来源于stack exchange,提问作者Rémy.W
相关产品推荐
相关产品推荐

