1. ホーム
  2. java

[解決済み] Spring bootのcatchブロックにコードカバレッジを追加する

2022-02-16 07:39:04

質問

使用方法 2.1.6.RELEASE

これは私のserviceImplクラスで、repo.saveメソッドで、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

を持つExceptionを投げるにはどうすればよいですか? getCauseConstraintViolationException ということで、すべての行がテストでカバーされます

解決方法は?

キャッチブロックの中で、2つのユースケースをテストする必要があります。

例外の原因が ConstraintViolationException

.thenThrow(new RuntimeException(new ConstraintViolationException("Field not Unique", null, "title")));

例外の原因が ConstraintViolationException

.thenThrow(new RuntimeException("oops"));

この場合 @ExpectedException は、次のようになります。 RuntimeException