모르지 않다는 것은 아는것과 다르다.

Junit 14

SpringBatch Test

Spring Batch Job 아래와 같이 Job 을 구현했다고 했을때, 아래의 코드를 테스트해보려고 한다. 아래의 Job 은 AptNotificationRepository 에서 Apt 의 조건에 따라 메일로 공지를 보내는 Job 이다. @Configuration @RequiredArgsConstructor @Slf4j public class AptNotificationJobConfig { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @Bean public Job aptNotificationJob(Step aptNotificationStep) { return job..

Junit 2022.04.02

파라미터를 사용해서 테스트하기

Junit4 - JUnitParams 아래 코드는 중복된 코드가 많아 보인다. -> 원인은 매개변수를 받지 못했기 때문이다. public class EventTest { ... @Test public void testFree() { // Given Event event = Event.builder() .basePrice(0) .maxPrice(0) .build(); // When event.update(); // Then assertThat(event.isFree()).isTrue(); // Given event = Event.builder() .basePrice(100) .maxPrice(0) .build(); // When event.update(); // Then assertThat(event.is..

Junit 2022.02.27

테스트 더블

테스트 더블 테스트는 깔끔함과 단정함을 유지해야한다. -> 그러기 위해서는 독립적이어야 한다. 독립적이라는 것은 어떤 테스트도 다른 테스트에 의존하지 않는다는 것을 의미한다. 또한 어느 순서로든, 어떤 개별 테스트라도 실행해 볼 수 있어야 한다. 독립적인 테스트를 작성하려면 테스트 대상을 의존하는 것으로부터 격리(Isolation) 시켜야한다. 여기서 의존하는 것으로부터 격리하면 의존하는 것에대한 대체물이 필요하다. -> 이 대체물이 테스트 더블이라고 할 수 있다. 테스트 코드를 작성함에 있어서 DOC(depoended-on component; 의존 구성 요소)를 사용할 수 없다면, 테스트 더블로 대체할 수 있다. 테스트 더블의 역할을 아래와 같이 정리할 수 있다. 테스트 대상 코드를 격리합니다. 테스트..

Junit 2022.02.27

WebMvc Test

@RunWith(SpringRunner.class) @WebMvcTest public class EventControllerTests { @Autowired MockMvc mockMvc; @Test public void createEvent() throws Exception { mockMvc.perform(post("/api/events/") .contentType(MediaType.APPLICATION_JSON_UTF8) //요청타입 .accept(MediaTypes.HAL_JSON)) //받고싶은 타입 .andExpect(status().isCreated()); } } MockMvc 클래스를 사용하면 스프링 MVC 테스트 핵심 클래스 mockMvc 를 사용하면 사용해서 가짜 요청을 만들어서 목킹이 되..

Junit 2022.02.27

단위테스트 vs 통합테스트

테스트 코드의 안정성을 높이고, 기능을 추가하거나 수정하면서 발생하는 부작용(Side-Effect)를 줄일 수 있다. 기존 코드를 수정하는 것에 대한 불안감을 줄일 수 있고, 결과적으로 생산성을 높여줄 수 있다. 테스트는 외부의 문제가 발생하지 않는이상 계속해서 일관적인 결과를 제공해주어야 한다. 스프링부트 테스트는 크게 단위테스트와 통합테스트로 나뉜다. 스프링부트 테스트 관련 애노테이션은 아래와 같습니다. 단위테스트란 단위 테스트는 가장 작은 단위의 테스트다. 슬라이스 테스트 라고도 한다. 개발 단계에서 각 모듈이 개발완료된 시점에서 수행되는 테스트다. F.I.R.S.T 단위 테스트 원칙 Fast : 테스트 코드를 실행하는 일은 오래 걸리면 안된다. Independent:독립적으로 실행이 되어야 한다...

Junit 2022.02.27

Service 단위테스트

Service 단위테스트 Service 레이어만 단위테스트 하기위해서는 먼저 Controller와의 연결을 끊어야한다. Controller는 Web모듈이므로 Service Test를 진행하려면 Web에 대한 의존성을 받으면 안된다. @WebMvcTest, @SpringBootTest와 같은 테스트를 사용하면 Service만을 테스트하기가 어려워진다. 두 번째로 Repository와의 연결을 끊어야 한다. Domain을 통해 비즈니스 로직은 수행해야하지만, 실제로 DB에 저장할 건 아니기 때문에 이 부분을 제거할 방법이 필요하다. SpringBoot 테스트는 특정 객체를 가짜로 대체할 Mocking을 제공하고 있고, 아래와 같은 Annotation을 제공한다. @Mock @MockBean @Spy @Spy..

Junit 2022.02.27

Repository 단위테스트

Repository 단위테스트 Ropsitory 서비스에서 엔티티의 영속화를 위해서 Repository를 호출한다. 이렇게 Repository 의 기능만을 테스트 하기위해서는 Service와의 결합을 끊어야 한다. SpringBoot 테스트는 @DataJpaTest Annottation을 제공하는데, 이것을 통해 Repository의 단위 테스트가 가능하다. @DataJpaTest persistence layer 를 슬라이스 테스트하기 위한 각종 자동 설정을 지원한다. @DataJpaTest 테스트는 저장을 위한 JPA 연관 관계가 적절히 구성되었는지, Repository 메서드가 제대로 구현되었는지 확인하는 것이 목적이다. JPA 관련된 설정만 로드한다. WebMVC와 관련된 Bean이나 기능은 로드되..

Junit 2022.02.27

MockMvc

MockMvc 란? 애플리케이션을 배포하지 않고도, 서버의 MVC 동작을 테스트 할 수 있는 라이브러리이다. 실제 객체와 비슷하지만 테스트에 필요한 기능만 가지는 가짜 객체를 만들어서 애플리케이션 서버에 배포하지 않고도 스프링 MVC 동작을 재현할 수 있는 클래스를 의미한다. 주로 Controller 레이어 단위테스트에 많이 사용된다. MockMvc는 크게 세가지 동작을 갖는다. perform 가상의 request(요청)를 처리한다. request(요청)은 MockHttpServletRequestBuilder를 통해서 생성된다. except 가상의 response에 대해서 검증한다. 검증항목은 아래와 같다. hadler() status() model() view() 위 메서드들은 ResultMacher를..

Junit 2022.02.27

Mockito

Mockito 란? Mock: 진짜 객체와 비슷하게 동작하지만 프로그래머가 직접 그 객체의 행동을 관리하는 객체다. Mockito: Mock 객체를 쉽게 만들고 관리하고 검증할 수 있는 방법을 제공한다. 테스트를 작성하는 자바 개발자 50%+ 사용하는 Mock 프레임워크다. Mock 객체 생성 @ExtendWith(MockitoExtension.class) class StudyServiceTest { @Mock MemberService memberService; @Mock StudyRepository studyRepository; @Test void createStudyService() { StudyService studyService = new StudyService(memberService, stud..

Junit 2022.02.27

Junit5 애노테이션 비교

개요 평소 착각할 수 있는 junit 애노테이션을 비교해 보고자 한다. @Mock vs @MockBean 공통점 둘 모두 특정부분을 단위테스트 하고 싶을때, 테스트하고 싶은 모듈에 의존성을 가지고 있는 모듈을 Mock객체로 대체하고 조작하여 테스트할 수 있다. 둘 모두 given, when. verify 등을 사용하여 행위를 테스트한다. @Mock 모키토 라이브러 내에 존재한다. Mock은 가짜객체를 만드는데 스프링빈에 등록이 안되는 객체이다. 스프링 컨테이너가 DI를 하는 방식이 아니라 객체생성시 생성자에 Mock객체를 직접 주입해준다. 생성자 주입을 사용해야 편하게 사용 가능합니다. 스프링을 띄우지 않으므로 MockBean을 사용할때보다 빠르다. @InjectMocks에 대해서만 해당 클래스안에서 정..

Junit 2022.02.27