Spring Unit Testing & Mockito &통합 테스팅
Unit test 하는 이유.
버그 발견 시간이 늦어짐에 따라 비용이 기하급수적으로 커지는 걸 알 수 있습니다.
따라서 테스트 코드를 작성한다면 프로그램의 버그를 사전에 발견하여 기하급수적인 비용의 증가가능성을 사전에 방지할 수 있습니다.
개발자는 단위 테스트 (Unit Testing) 를 작성하여 프로그램을 테스트 할 수 있습니다.
JUnit5 다루기
어노테이션 Before - After
@BeforeEach : 각각 테스트 실행전에 실행 (모든 테스트들)
@AfterEach : 각각 테스트 실행후에 실행 (모든 테스트들)
@BeforeAll : 테스트 가 실행 되기전에 최초로 실행 (한번)
@AfterAll : 테스트 가 실행 된 후 에 실행 (한번)
어노테이션 테스트 꾸미기 :
@DisplayName : 테스트 할때 이름 표시
@Nested : 주제 별로 테스트를 그룹지어서 파악하기 좋습니다.
@Order : 테스트 순서를 정함, 밑에 코드 가 필요.
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
어노테이션 테스트 반복하기 (for loop 처럼)
@RepeatedTest : 해당 테스트 메서드를 반복할 수 있습니다.
@RepeatedTest(value = 5, name = "반복 테스트 {currentRepetition} / {totalRepetitions}")
name 속성을 사용하여 네이밍할 수 있습니다.
RepetitionInfo 값을 파라미터로 받아서 현재 반복 횟수와 총 횟수 값을 확인.
결과값 예측하기.
Assertions
Assertions.assertEquals(expected, actual) : 예측 값 넣고 비교 하기
Assertions.assertTrue(boolean) : 예측 값이 true 일거라고 하고 비교하기
Assertions.assertNotNull(actual) : 예측 값이 NotNull 일거라고 하고 비교하기
Assertions.assertThrows(expectedType, executable) : 결과가 예상한 해당 클래스 타입이라면 테스트에 성공.
(assertThrows() 메서드는 첫 번째 파라미터에 예상하는 Exception 클래스 타입을 넣고 두 번째 파라미터에 실행 코드를 넣으면 됩니다.)
Given - When - Then
Given : 실제로 실행하기 전에 테스트에 필요한 값(상태)을 미리 선언.
When : 테스트 하고자하는 대상을 실제로 실행.
Then: 어떤 특정한 행동(테스트 대상 실행) 때문에 발생할거라고 예상되는 결과에 대해 예측하고 맞는지 확인합니다. (finally 같이)
JUnit 5 User Guide
https://junit.org/junit5/docs/current/user-guide/#writing-tests-annotations
JUnit 5 User Guide
Although the JUnit Jupiter programming model and extension model do not support JUnit 4 features such as Rules and Runners natively, it is not expected that source code maintainers will need to update all of their existing tests, test extensions, and custo
junit.org
Mockito
Mock object (가짜 객체)
이상적으로, 각 테스트 케이스는 서로 분리되어야 한다. 이를 위해 가짜 객체(Mock object)를 생성하는 것도 좋은 방법이다.
분리 되기 어려운 클래스들
가짜객체 (Mock object) 를 통한 분리 방법

가짜 객체 (Mock object) 로 분리합니다.
MockRepository
(실제 객체와 겉만 같은 객체입니다.)
동일한 클래스명, 함수명
(실제 DB 작업은 하지 않습니다)
테스트를 위해 필요한 결과값을 return
이하 간단히 'mock' (목) 이라고 부르기로 했습니다.
Mockito framework: Mock 객체를 쉽게 만들 수 있는 방법 제공합니다.
(Mock 을 사용할때 선언만 하지말고 , 사용 케이스를 제대로 정의 해야 합니다.)
통합 테스트란
단위 테스트 VS 통합 테스트

단위 테스트 (Unit Test)
- 하나의 모듈이나 클래스에 대해 세밀한 부분까지 테스트가 가능합니다.
- 하지만 모듈 간에 상호 작용 검증은 할 수 없습니다.
통합 테스트 (Integration Test)
- 두 개 이상의 모듈이 연결된 상태를 테스트할 수 있습니다.
- 모듈 간의 연결에서 발생하는 에러 검증 가능합니다.
Spring Boot를 이용한 통합 테스트
통합 테스트
- 여러 단위 테스트를 하나의 통합된 테스트로 수행합니다.
- 단위 테스트 시 Spring은 동작되지 않습니다.
@SpringBootTest
- 스프링이 동작되도록 해주는 애너테이션입니다.
- 테스트 수행 시 스프링이 동작합니다.
- Spring IoC/DI 기능을 사용 가능합니다.
- Repository를 사용해 DB CRUD가 가능합니다.
(그래서 테스트 돌릴때 다른 파일(관련없는것들도) 에 에러가 있으면 오류가 나왔던것.....)