【发布时间】:2019-11-07 13:57:08
【问题描述】:
使用2.1.6.RELEASE
这是我的带有 repo.save 方法的 serviceImpl 类,如果 db 字段重复,我们会捕获异常并在响应中返回
@Service
public class CoreVoucherServiceImpl implements CoreVoucherService {
@Override
@Transactional(propagation = REQUIRED)
public VoucherDTO createVoucher(VoucherDTO voucherDTO) {
... /* transforming DTO to Entity */
try {
voucherRepository.save(voucher);
} catch (Exception e) {
if (e.getCause() instanceof ConstraintViolationException) {
throw new MyException(FIELD_NOT_UNIQUE, "title");
}
UB_LOGGER.debug("Error in create voucher", e);
throw e;
}
voucherDTO.setId(voucher.getId());
return voucherDTO;
}
}
我无法为 catch 块添加代码覆盖率。我的测试课是
@SpringBootTest
@RunWith(SpringRunner.class)
public class CoreVoucherServiceTest {
@Autowired
private CoreVoucherService coreVoucherService;
@MockBean
private VoucherRepository voucherRepository;
@Test
// @Test(expected = MyException.class)
public void createVoucherTest() {
VoucherDTO dto = prepareCreateVoucher();
when(voucherRepository.save(any())).thenThrow(Exception.class);
coreVoucherService.createVoucher(dto);
}
}
通过上述方式我得到以下错误
org.mockito.exceptions.base.MockitoException:
Checked exception is invalid for this method!
Invalid: java.lang.Exception
如何抛出 getCause 为 ConstraintViolationException 的异常,以便测试涵盖所有行
【问题讨论】:
-
你试过抛出不同类型的异常吗?
-
是的,但这不包括
MyException线 -
如果是 ConstraintViolationException 类型,是的,如果你抛出异常,不是。您是否阅读了您要测试的代码?仅当您的 try 块抛出 ConstraintViolationException 时才会抛出 MyException
-
@Stultuske 如何抛出
getCause为ConstraintViolationException的异常,因此所有行都包含在测试中
标签: java spring-boot junit code-coverage