Добавление покрытия кода для блока catch при загрузке Spring - PullRequest
0 голосов
/ 07 ноября 2019

Использование 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

Как вызвать исключение, getCause равное ConstraintViolationException, чтобы все строки были покрытытестирование

Ответы [ 3 ]

1 голос
/ 07 ноября 2019

Вы должны проверить два варианта использования в вашем блоке перехвата:

Когда причиной исключения является ConstraintViolationException

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

Когда причиной исключения не является ConstraintViolationException

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

для этого случая @ExpectedException будет RuntimeException

0 голосов
/ 15 ноября 2019

Вы также можете тестировать исключения с помощью @Rule и ExpectedException в Junit.

@SpringBootTest
@RunWith(SpringRunner.class)
public class CoreVoucherServiceTest {

    @Autowired
    private CoreVoucherService coreVoucherService;

    @MockBean
    private VoucherRepository voucherRepository;

    @Rule
    public ExpectedException exceptionRule = ExpectedException.none();

    @Test
    // @Test(expected = MyException.class)
    public void createVoucherTest() {
        exceptionRule.expect(Exception.class); // Better if you specify specific Exception class that is going to be thrown.
        VoucherDTO dto = prepareCreateVoucher();
        when(voucherRepository.save(any())).thenThrow(Exception.class);
        coreVoucherService.createVoucher(dto);
    }
}
0 голосов
/ 07 ноября 2019

Вы должны выбросить ConstraintViolationException, потому что метод save не генерирует ни одного проверенного исключения в соответствии с определением его метода save

when(voucherRepository.save(any()))
      .thenThrow(.ConstraintViolationException.class); 
...