on
TIL : JUnit, Mockito
TIL : JUnit, Mockito
12/20 JUnit, Mockito
JUnit 연습문제
테스트 이름을 표기하는 방법으로 공백, 특수 문자 등을 자유롭게 쓸 수 있는 애노테이션은?
@DisplayName
JUnit 5, jupiter는 크게 세가지 모듈로 나눌 수 있습니다. 다음 중에서 테스트를 실행하는 런처와 테스트 엔진의 API를 제공하는 모듈은 무엇일까요?
① junit jupiter ② junit vintage ③ junit platform
1번!
JUnit 5에서 테스트 그룹을 만들고 필터링 하여 실행하는데 사용하는 애노테이션은?
@Tag?
다음 코드는 여러 Assertion을 모두 실행하려는 테스트 코드입니다. 빈칸에 적절한 코드는 무엇인가요?
@Test @DisplayName("스터디 만들기") void create_new_study() { Study actual = new Study(1, "테스트 스터디"); ________( () -> assertEquals(1, actual.getLimit()), () -> assertEquals("테스트 스터디", actual.getName()), () -> assertEquals(StudyStatus.DRAFT, actual.getStatus()) ); } @assertAll!
다음은 JUnit 5가 제공하는 애노테이션으로 컴포짓 애노테이션을 만드는 코드입니다. 이 애노테이션에 적절한 Rention 전략은 무엇인가요?
@Target(ElementType.METHOD) @Retention(______________) @Test @Tag("fast") public @interface FastTest { } RUNTIME!
다음 중 JUnit 5가 제공하는 확장팩 등록 방법이 아닌것은?
① @ExtendWith
② @Rule
③ @RegisterExtension
④ ServiceLoader
1번!
다음 코드는 유즈케이스 테스트를 작성한 것입니다. 다음 빈 칸에 적절한 코드는?
@TestInstance(TestInstance.Lifecycle.________) @TestMethodOrder(MethodOrderer.___________.class) public class StudyCreateUsecaseTest { private Study study; @Order(1) @Test @DisplayName("스터디 만들기") public void create_study() { study = new Study(10, "자바"); assertEquals(StudyStatus.DRAFT, study.getStatus()); } @Order(2) @Test @DisplayName("스터디 공개") public void publish_study() { study.publish(); assertEquals(StudyStatus.OPENED, study.getStatus()); assertNotNull(study.getOpenedDateTime()); } } 1. PER_CLASS 2. ORDER
다음은 여러 매개변수를 바꿔가며 동일한 테스트를 실행하는 코드입니다. 빈칸에 적잘한 코드는?
@Order(4) @DisplayName("스터디 만들기") @________________(name = "{index} {displayName} message={0}") @CsvSource({"10, '자바 스터디'", "20, 스프링"}) void parameterizedTest(@___________(StudyAggregator.class) Study study) { System.out.println(study); } static class StudyAggregator implements ArgumentsAggregator { @Override public Object aggregateArguments(ArgumentsAccessor accessor, ParameterContext context) throws ArgumentsAggregationException { return new Study(accessor.getInteger(0), accessor.getString(1)); } } ParamertizedTest
Mockito
Mock: 진짜 객체와 비슷하게 동작하지만 프로그래머가 직접 그 객체의 행동을 관리하는 객체.
Mockito: Mock 객체를 쉽게 만들고 관리하고 검증할 수 있는 방법을 제공한다.
리포지토리를 사용하거나 외부 API서버를 활용하는 경우에 유용하게 사용할 수 있다.
마틴 파울러의 유닛테스트에 대한 고찰 : https://martinfowler.com/bliki/UnitTest.html
단위란 클래스 단위가 아닌 행동, 기능을 하나의 단위로 볼 수 있다.
Mockito Start!
스프링 2.2+ 버젼을 사용할 경우 start-test 디펜던시를 추가하면 자동으로 추가가 됨
특정 클래스의 각자 객체 또는 인터페이스의 각자 객체를 만드는 방법, 관리하는 방법, 행동을 검증하는 방법
구현체는 없지만 의존성이 필요한 인터페이스의 경우 Mocking하기 좋은 경우!
Method 사용
어노테이션 사용 (Field로도 사용가능)
Mock 객체 Stubbing
Stubbing : 객체의 행동을 조작하는 것
기본적으로 모든 Mock 객체는.. Null을 리턴한다. (Optional 타입은 Optional.empty 리턴) Primitive 타입은 기본 Primitive 값. 콜렉션은 비어있는 콜렉션. Void 메소드는 예외를 던지지 않고 아무런 일도 발생하지 않는다.
memberService.findById() 메소드에 1L 인자가 들어올 경우 member를 리턴해줘
이런 식으로 인자에 어떤 값이 들어왔을 때 어떤 값을 리턴할지
어떤 예외를 날릴지에 대해 조작을 해줄 수 있다
from http://jacksonhong.tistory.com/56 by ccl(A) rewrite - 2021-12-20 09:30:21