Какой репозиторий вернет, если объект не найден в тестах - PullRequest
0 голосов
/ 04 августа 2020

Мой вопрос: какой репозиторий вернет, если объект не найден в тестах junit.

У меня есть такой тест:

@RunWith(MockitoJUnitRunner.class)
@SpringBootTest
public class CouponServiceTestSuite {
    private final static String HOME_TEAM = "home team";
    private final static String AWAY_TEAM = "away team";
    @Autowired
    private CouponService couponService;
    @MockBean
    private CouponRepository couponRepository;
    @MockBean
    private MatchRepository matchRepository;
    @Test
    public void shouldThrowException() {
        //Given
        //When
        //Then
        Assertions.assertThrows(BetWinnerException.class, () -> couponService.getCoupon(-6L));

Я хочу издеваться над этим, например:

Mockito.when(couponRepository.findById(ArgumentMatchers.anyLong()).thenReturn(null);

Мой класс обслуживания:

@Slf4j
@RequiredArgsConstructor
@Service
public class CouponService {
    private final CouponRepository couponRepository;
    private final MatchRepository matchRepository;
    private final CouponMapper couponMapper;

    public List<CouponDto> getCoupons() {
        log.debug("Getting all coupons");
        List<Coupon> couponList = couponRepository.findAll();
        List<CouponDto> couponDtoList = couponMapper.mapToCouponDtoList(couponList);
        log.debug("Return all coupons: {}", couponDtoList);
        return couponDtoList;
    }

    public CouponDto getCoupon(Long couponId) {
        log.debug("Getting coupon by id: {}", couponId);
        Coupon coupon = couponRepository.findById(couponId).orElseThrow(()
                -> new BetWinnerException(BetWinnerException.ERR_COUPON_NOT_FOUND_EXCEPTION));
        CouponDto couponDto = couponMapper.mapToCouponDto(coupon);
        log.debug("Return coupon: {}", couponDto);
        return couponDto;
    }

    public CouponDto createCoupon() {
        log.debug("Creating new coupon");
        Coupon coupon = couponRepository.save(new Coupon());
        CouponDto couponDto = couponMapper.mapToCouponDto(coupon);
        log.debug("Return created coupon: {}", couponDto);
        return couponDto;
    }

    public CouponDto addMatch(Long couponId, Long matchId) {
        log.debug("Add match to the coupon: {}{}", matchId, couponId);
        Coupon coupon = couponRepository.findById(couponId).orElseThrow(()
                -> new BetWinnerException(BetWinnerException.ERR_COUPON_NOT_FOUND_EXCEPTION));
        Match match = matchRepository.findById(matchId).orElseThrow(()
                -> new BetWinnerException(BetWinnerException.ERR_MATCH_NOT_FOUND_EXCEPTION));
        coupon.getMatchList().add(match);
        Coupon updatedCoupon = couponRepository.save(coupon);
        CouponDto couponDto = couponMapper.mapToCouponDto(updatedCoupon);
        log.debug("Return coupon with added match: {}", couponDto);
        return couponDto;
    }

    public boolean deleteCoupon(Long couponId) {
        log.debug("Deleting coupon id: {}", couponId);
        couponRepository.deleteById(couponId);
        if (couponRepository.existsById(couponId)) {
            log.debug("Coupon not deleted id: {}", couponId);
            return false;
        } else {
            log.debug("Coupon deleted id: {}", couponId);
            return true;
        }
    }
}

Я думал, что он возвращает null, но когда я это делаю, он возвращает NullPointerException. Моя служба возвращает BetWinnerException, если объект не найден. Так что он вернет? Как мне создать этот тест?

Подобный тест работает правильно, но я не хочу использовать id = -6. Я просто хочу как-нибудь поиздеваться.

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Вы издеваетесь над couponRepository, но используете couponService, и, поскольку в вашем тесте нет кода, показанного, как он инициализируется, трудно сказать, в чем проблема.

Теперь, когда вы обновили на ваш вопрос, ответ довольно очевиден:

  • в службе код ожидает, что couponRepository.findById() вернет Optional, чтобы он мог выбросить исключение, если оно пустое
  • mocked beans - это «нормальные» Mockito mocks, которые пытаются вернуть полезный результат; для коллекции это пустая коллекция, для объектов это null - обычно
  • TIL, что Mockito 2 будет поддерживать то, что вы ожидаете: https://www.baeldung.com/mockito-2-java-8#return -default-values-for-optional-and-stream
  • в этой статье также показано, как заставить Mockito 1 возвращать пустые Optional
  • , которые вы пытались вернуть, null, но на самом деле вам нужно Optional.empty()

Или я неправильно понял, как вы на самом деле тестируете и в чем ваша проблема?

  • Вы получаете NullPointerException в сервисе, как я понял?
  • Или нет вы уже используете Mockito 2 и у вас возникла другая проблема?
0 голосов
/ 04 августа 2020

Пожалуйста, опубликуйте свой тестовый класс

Добавьте аннотацию @InjectMocks над @Autowired в сервисе, который вы объявили в своем тесте, и посмотрите, решит ли он проблему, однако я не думаю, что это сработает, учитывая вас объявить ваше РЕПО как ОКОНЧАТЕЛЬНОЕ в вашей Службе. Если это не FINAL и @Autowired, InjectMocks подойдет для вашего макета. Но если вам действительно нужен ФИНАЛЬНЫЙ вариант, попробуйте следующее:

https://www.baeldung.com/mockito-final

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...