과거(폭포수)와 달리 테스트 부터 진행 (기능이 올바르게 동작하는지 검증)
그 다음에 구현을 한다.
테스트는 독립적이고 반복 가능해야 한다.
• 테스트는 체계적이고 테스트 코드 구조를 잘 반영해야 한다.
• 테스트는 간단하고 재사용성이 좋아야 한다.
• 테스트가 실패한 경우 그에 대해 최대한 많은 정보를 제공해야 한다.
• 테스트 프레임웍은 테스트 작성자들이 테스트를 돌리는데 신경 쓸 필요 없이
테스트 작성 자체에 집중할 수 있도록 되어있어야 한다.
• 테스트는 빨라야 한다.
• 테스트의 시작은 어설션과 함께 한다.
• 결과 상태 체크를 한다.
• 어설션의 결과는 성공, 실패로 구성된다.
• 테스트들은 여러가지 어설션들을 가지고 코드의 동작을 테스트한다.
• 테스트가 깨지거나 어설션이 실패하면 그 테스트는 실패, 또는 성공이다.
• 테스트 케이스는 하나 이상의 테스트들을 포함한다.
• 테스트 대상 코드의 구조를 반영하는 여러 테스트들을 테스트 케이스에 집어
넣을 수 있다.
• 테스트 케이스 내의 여러 테스트들이 공통으로 이용하는 객체나 서브루틴들은
가질 수 있다.(함수로 빼 놓을 수 있다)
• 테스트 프로그램은 여러 테스트 케이스를 가질 수 있다.
단위 테스트 Framework 중 하나이다.
• 단언문으로 테스트 케이스의 수행 결과를 판별할 수 있다.
• 어노테이션으로 간결하게 지원한다.
• 결과는 성공(녹색), 실패(붉은색) 중 하나로 표시된다.
• 스프링 부트 2.2부터 JUnit 버전을 JUnit5을 지원한다.
• JUnit 5는 런타임에 Java 8 이상이 필요하다.
• 그러나 이전 버전의 JDK로 컴파일 된 코드는 계속 테스트 할 수 있

• JUnit Platform은 JVM에서 테스트 프레임워크를 실행하는데 기초를 제공한다. 또한
• Test Engine API를 제공해 테스트 프레임워크를 개발할 수 있다.
실제 테스트에 관련된 API
• Jupiter와 Vintage는 JUnit Platform이 제공하는 Test Engine API의 구현체이다.
• JUnit5의 구현체이다.
• 하위 호환성을 위한 JUnit3, JUnit4의 구현체이다.
시제품
인터페이스
사전에 함수명등을 정의
이것을 손쉽게 적용하게 라이브러리로 지원
mockito
testImplementation('org.mockito:mockito-core:4.3.1');
testImplementation("org.mockito:mockito-junit-jupiter:4.3.1")
• 테스트 클래스란 ?
-> 클래스 스태틱 멤버 클래스, @Nested 클래스에 적어도 한개의 @Test 어노테이션이 있는 메서드가 있어야 된다.
• 추상 클래스는 테스트 클래스가 될 수 없다. JUnit 프레임 웍에서 객체를 생성 할 수 없기 때문이다.
-> @Test, @RepeatedTest, @ParamterizedTest, @TestFactory, @TestTemplate 같은 메타 어노테이션이 메서드에 붙은 것을 의미한다.
**
-> @BeforeAll , @AfterAll , @BeforeEach , @AfterEach 같은 메타 어노테이션이 메서드에 붙여진 것을 의미한다.
• 테스트 메서드와 라이플사이클 메서드는 테스트 할 클래스, 상속한 부모클래스 또는 인터페이스에 선언된다.
• 추가로 테스트 메서드와 라이프사이클 메서드는 abstrac로 선언되면 안된다.
• 메서드는 리턴 형은 반드시 void 이어야 한다.
• 테스트 클래스, 테스트 메서드, 라이플사이클 메서드의 접근제어자는 private은 안된다
assertEquals(expected, actual) 실제 값이 기대하는 값과 같은 지 검사한다.
assertNotEquals(unexpected, actual) 실제 값이 특정 값과 같지 않은 지 검사한다.
assertSame(Object expected, Object actual) 두 객체가 동일한 객체인지 검사한다.
assertNotSame(Object unexpected, Object actual) 두 객체가 동일하지 않은 객체인지 검사한다.
assertTrue(boolean condition) 값이 true인지 검사한다.
assertFalse(boolean condition) 값이 false인지 검사한다.
assertNull(Object actual) 값이 null인지 검사한다.
assertNotNull(Object actual) 값이 not null이 아닌지 검사한다.
fail() 테스트를 실패 처리한다.
assertEquals는 함수를 호출, assertSame는 해시코드 비교
assertThrows(Class expected, Executable
executable)
executable을 실행한 결과로 지정한 타입의 예외가 발생
하는지 검사 한다.
assertDoesNotThrow(Executable executable)
executable을 실행한 결과로 예외가 발생하는지 않는지
검사 한다.
assertAll(Executable executable)
executable을 지정한 모든 검증을 실행하고 실패한 것이
있는지 확인 할 수 있다.
assertTimeout(Duration timeout, Executable
executable)
executable을 지정한 검증을 지정된 시간 동안 실행하는 지
검사하며, executable 루틴 실행 완료 될 때 까지 대기 한다.
assertTimeoutPreemptively (Duration timeout,
Executable executable)
executable을 지정한 검증을 지정된 시간 동안 실행하는 지
검사하며, 지정된 시간을 초과하면 테스트 실패 되면 자동
종료 된다.
@BeforeEach
각각 테스트 메서드가 실행되기전에 실행되어야 하는 메서드를 명시해준다.
@Test , @RepeatedTest , @ParameterizedTest , @TestFactory 가 붙은 테스트 메서드가 실행
하기 전에 실행된다. JUnit4의 @Before 와 같은 역할을 한다. 테스트 하기 전에 필요한 목업
데이터를 미리 세팅 해주기 위해 주로 사용한다.
@AfterEach
@Test , @RepeatedTest , @ParameterizedTest , @TestFactory 가 붙은 테스트 메서드가
실행되고 난 후 실행된다. JUnit4의 @After 어노테이션과 같은 역할을 한다.
@BeforeAll
@BeforeEach 는 각 테스트 메서드 마다 실행되지만, 이 어노테이션은 테스트가 시작하기 전
딱 한 번만 실행 된다.
@AfterAll 이것도 위와 같다. 테스트가 완전히 끝난 후 딱 한 번만 실행 된다
BeforeEach,AfterEach 테스트 캐이스마다 실행
BeforeAll, AfterAll은 모두 실행
@BeforeAll 스태틱 객체 초기화 할 때 사용된다.
@BeforeEach 객체 생성등에 사용(초기화)
@DisplayName 테스트 클래스나 테스트 메서드에 이름을 붙여줄 때 사용한다.
@DisplayNameGeneration 클래스에 해당 어노테이션을 붙이면 @Test 메서드 이름에 언더바(_) 로 표시한 모든 부분은 공백으로 처리된다.
@Nested test 클래스 안에 Nested 테스트 클래스를 작성할 때 사용되며, static이 아닌 중첩
클래스, 즉 Inner 클래스여야만 한다. 테스트 인스턴스 라이플사이클이 per-class 로 설정
되어 있지 않다면 @BeforeAll , @AfterAll 이 동작하지 않는다.(주의)
@Tag 테스트를 필터링할 때 사용한다. 클래스 또는 메서드레벨에 사용한다.
@Disabled 테스트 클래스나, 메서드의 테스트를 비활성화 한다. JUnit4의 @Ignore와 같다.
@Timeout 주어진 시간 안에 테스트가 끝나지 않으면 실패한다.
@ExtendWith extension을 등록한다. 이 어노테이션은 상속이 된다. 확장 팩이라고 생각하면 된다.
@Nested 안에서는 @BeforeAll을 사용하면 안됨

각 매개변수가 null일 때 상황을 비교해야 함
하지만 이렇게 하면 너무 많이 걸려서

이러게 람다문으로 작성
테스트는 하나하나씩