-
테스트 더블: 출력값테스팅 관련/개념 2020. 8. 9. 23:40
이어지는 시리즈
더미 객체, 테스트 스텁, 페이크 객체 → 입력값 제공
모의 객체(Mock), 스파이 객체 →입력값, 세밀한 모니터링 기능 제공테스팅은 function 출력값을 확인하는 것보다 더 많은 것을 포함한다.
만약, function이 void값을 리턴한다면?
상호작용(interactions)을 테스트할 것!
- 올바른 순서대로 메소드가 호출되었는지
- 메소드가 호출 되었는지/안 되었는지
- 메소드 호출에 적절한 파라미터들이 사용되었는지
모의 개체는 페이크 객체들의 상호작용을 관찰할 수 있게 해준다
// Mocking은 객체 간의 상호작용을 결정하는데 사용된다 // AirlineTravelService에 대해 호출되는 메소드를 보여주는 예제 @Test public void testBookFlight() throws Exception { // 더미 객체 생성 AirlineTravelService stubSvc = mock(AirlineTravelService.class); // 데이터 스텁 Date d = new Date(); Flight f1 = new Flight(d, "Delta", "DL1029", BigDecimal.valueOf(450.13)); Flight f2 = new Flight(d, "American", "AM245", BigDecimal.valueOf(375.13)); when(stubSvc.confirmFlight(f1)).thenReturn(true); when(stubSvc.confirmFlight(f2)).thenReturn(false); EmployeeTravelScheduler ets = new EmployeeTravelScheduler(stubSvc); Employee empl = createDummyEmployee(); PaymentMethod method = mock(PaymentMethod.class); assertTrue(ets.bookFlight(empl, f1, method)); assertFalse(ets.bookFlight(empl, f2, method)); // Mocking 결과: // confirmFlight 메소드는 2번 호출되었다 verify(stubSvc, times(2)).confirmFlight(any(Flight.class)); // bookflight 메소드는 flight f1에 의해 1번 호출되었다 verify(stubSvc).bookFlight(f1, method); // InOrder을 사용하여, 모의객체를 사용했을 때 메소드가 호출된 순서 확인 InOrder inOrder = InOrder(stubSvc); inOrder.verify(stubSvc).confirmFlight(any(Flight.class)); inOrder.verify(stubSvc).bookFlight(f1, method); }
스파이 객체는 실제 객체들의 상호작용을 관찰할 수 있게 해준다
// 스파이 예제 // 실제 객체들의 상호작용을 점검하고, 그들의 동작을 무시할 수 있다 @Test public void testBookFlgihtSpy() throws Exception { AirlineTravelService stubSvc = mock(AirlineTravelService.class); // 데이터 스텁 Date d = new Date(); // 스파이 생성 List<Flights> l = spy(new ArrayList<>()); Flight f1 = new Flight(d, "Delta", "DL1029", BigDecimal.valueOf(450.13)); Flight f2 = new Flight(d, "American", "AM245", BigDecimal.valueOf(375.13)); l.add(f1); l.add(f2); when(f1.getPrice()).thenReturn(BigDecimal.valueOf(200.00)); when(stubSvc.findFlights(any(Date.class))) .thenReturn(); EmployeeTravelScheduler ets = new EmployeeTravelScheduler(stubSvc); Employee empl = createDummyEmployee(); assertEquals(ets.findFlights(empl, d).get(0), f2); // Flight이 2번 추가되었는지 확인 verify(l, times(2)).add(any(Flight.class)); }
'테스팅 관련 > 개념' 카테고리의 다른 글
소프트웨어 테스트 수명 주기(STLC) (0) 2020.10.04 SW 테스트 7가지 원리 (0) 2020.09.29 테스트 더블: 입력값 (0) 2020.08.09 테스트 더블: 소개 (0) 2020.08.09 소프트웨어 테스팅 프로세스 레벨 (0) 2020.06.20