@Mock객체를 사용해서 Page타입 객체 테스트코드 작성하기

2021. 7. 29. 13:34Spring

Mock을 사용해서 Page타입 테스트 코드 작성하기

Page타입을 어떻게 테스트 코드를 짜야할까..?

  • @Mock 객체는 빈 껍데기에 불과하기 때문에 @Mock객체에서 실행되는 메서드의 결과값을 미리 선언해둬야한다. → 이 부분 때문에 Page타입의 리턴값을 어떻게 미리 작성을 해야할까 라는 의문이 되었다...!!!

단위 테스트를 하고 싶은 곳은 어디인가

  • Service단에서 매개변수로 받은 데이터로 Repository에서 잘 데이터가 가공되서 넘어오는지를 검사하고 싶었다.
  • devicePacketLogRepository.findAllByDeviceIdentityAndIdLessThanAndCreationDateTimeBetweenOrderByCreationDateTimeDesc(deviceIdentity, packetListLastId, fromDateTime, toDateTime, pageRequest);
    Repository에서 호출할 메서드이다. 리턴타입이 Page 이기 때문에 이거에 대한 결과값을 미리 선언을 해야한다.

@Mock 객체를 사용해서 테스트 해보자

  • 일단 저는 tdd로 테스를 진행하기 때문에 이 글을 보시는 분들은 참고 해주세요 :)
//given
Long LASTID = 9007199254740991L;
Car car = new Car(4372L, LocalDateTime.now(), LocalDateTime.now(), "0B0240", "0B0240", "11거111", null, "000001971268552", LocalDate.now(), LocalDate.now(), null, null, (short) 2012, 1L, 4L, false, false, null);
DevicePacketLog devicePacketLog = new DevicePacketLog("000001971268552", PacketType.KEEP_ALIVE, LocalDateTime.of(2021,07,27,17,44,01));
LocalDateTime fromDateTime = devicePacketLog.getCreationDateTime().minusDays(7);
LocalDateTime toDateTime = devicePacketLog.getCreationDateTime();
  • 필요한 객체와 데이터들을 생성했습니다.
PageRequest pageRequest = PageRequest.of(0, 5);

List<DevicePacketLog> devicePacketLogList = new ArrayList<>();

DevicePacketLog log1 = new DevicePacketLog("000001971268552", PacketType.RT, LocalDateTime.of(2021,07,27,17,44,01));
DevicePacketLog log2 = new DevicePacketLog("000001971268552", PacketType.KEEP_ALIVE, LocalDateTime.of(2021,07,27,17,40,11));
DevicePacketLog log3 = new DevicePacketLog("000001971268552", PacketType.RT, LocalDateTime.of(2021,07,27,17,38,01));
DevicePacketLog log4 = new DevicePacketLog("000001971268552", PacketType.GPS_POSITION, LocalDateTime.of(2021,07,27,16,44,01));
DevicePacketLog log5 = new DevicePacketLog("000001971268552", PacketType.RT, LocalDateTime.of(2021,07,27,04,44,01));

devicePacketLogList.add(log1);
devicePacketLogList.add(log2);
devicePacketLogList.add(log3);
devicePacketLogList.add(log4);
devicePacketLogList.add(log5);
  • 이 부분에서 이제 Page객체를 만들기 위한 작업을 합니다.( 사실 이렇게 데이터를 일일히 작성하는게 맞나요..? 과감히 의견주세요.. 여러분들 😢)
Page<DevicePacketLog> responsePages = new PageImpl<>(devicePacketLogList);
  • 여기가 핵심인데요!!! List<DevicePacketLog> devicePacketLogList = new ArrayList<>(); 를 위에 있는 코드에 넣어줍니다.
    여기서 알아봐야할 게 new PageImpl<> 이 무슨 코드인가???
    • public PageImpl(List<T> content) {
         this(content, Pageable.unpaged(), null == content ? 0 : content.size());
      }
      Creates a new PageImpl with the given content. This will result in the created Page being identical to the entire List.
      Params: content – must not be null.
      • 주어진 내용으로 새로운 PageImpl을 생성한다. 이렇게 하면 생성된 페이지가 전체 목록과 동일하게 된다. Parm은 null이 아니어야한다.
  • 그런 다음 given(devicePacketLogRepository.findAllByDeviceIdentityAndIdLessThanAndCreationDateTimeBetweenOrderByCreationDateTimeDesc(car.getDeviceIdentity(), LASTID, fromDateTime, toDateTime, pageRequest)).willReturn(responsePages); 이렇게 이 메서드가 실행하면 이걸 반환해줘!! 라고 코드를 작성하면 됩니다.

참고사이트


Page 테스트코드 작성하기 StackOverFlow

'Spring' 카테고리의 다른 글

[Spring] BDDMockito VS Mockito  (0) 2021.08.12
[Spring] TDD VS BDD  (0) 2021.08.12
[Spring Boot] Spring Auditing 적용해보기  (0) 2021.06.02
[Spring Boot] 이메일 보내기  (0) 2021.06.02
[Spring Boot] @Validation Exception 처리하기  (0) 2021.06.02