@Transactional(rollbackFor = Exception.class)使用自定义异常测试
时间: 2024-09-11 13:05:50 浏览: 74
springboot中事务管理@Transactional的注意事项与使用场景
5星 · 资源好评率100%
在Java中,`@Transactional`注解是Spring框架提供的用于声明式事务管理的关键注解。它可以用在方法上,为方法提供事务性行为。`rollbackFor`属性是一个类型数组,用于指定触发回滚的异常类。如果方法执行过程中抛出了`rollbackFor`属性中定义的异常,那么当前事务将会被回滚。
使用`@Transactional(rollbackFor = Exception.class)`表示无论什么情况下,只要方法中抛出了异常(包括继承自`Exception`类的任何异常),就会触发事务回滚。不过通常情况下,我们不会这样使用,因为这样做意味着即使是很普通的异常也会导致事务回滚,这并不是一个好的实践。
对于自定义异常,如果我们希望它能够触发事务回滚,我们可以在自定义异常的类上使用`@Transactional`注解,或者在配置中定义相应的回滚规则。
下面是一个简单的例子来展示如何使用自定义异常测试事务回滚:
假设我们有一个服务类`OrderService`,其中有一个方法`placeOrder`,它可能会因为库存不足抛出一个自定义异常`InsufficientStockException`。
```java
@Service
public class OrderService {
@Autowired
private InventoryService inventoryService;
@Transactional
public void placeOrder(Order order) {
if (!inventoryService.hasEnoughStock(order)) {
throw new InsufficientStockException("库存不足");
}
// 处理订单逻辑
}
}
public class InsufficientStockException extends Exception {
public InsufficientStockException(String message) {
super(message);
}
}
```
在这里,`@Transactional`注解默认不需要显式声明,Spring默认会为`@Service`类中的公共方法提供事务支持。如果`placeOrder`方法因为`InsufficientStockException`而抛出异常,那么根据`@Transactional`注解的默认行为,当前事务将会被回滚。
为了测试这个事务回滚是否按预期工作,我们可以编写一个测试用例:
```java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class OrderServiceTest {
@Autowired
private OrderService orderService;
@Test(expected = InsufficientStockException.class)
public void testPlaceOrderWithInsufficientStockThrowsException() throws InsufficientStockException {
Order order = new Order();
// 设置订单信息
orderService.placeOrder(order);
// 如果没有抛出异常,测试将失败
}
}
```
这个测试用例将会检查当`placeOrder`方法因为库存不足抛出`InsufficientStockException`时,事务是否正确回滚。
阅读全文