'junit'에 해당되는 글 1건


처음배우는 스프링부트2의 

내용을 일부 요약하여 정리한 포스팅입니다.


@SpringBootTest


@SpringBootTest는 통합 테스트를 제공하는 기본적인 스프링 부트 어노테이션. 

실제 애플리케이션과 똑같이 애플리케이션 컨텍스트를 로드. 또한, 설정된 빈을 모두 load하기 때문에 규모가 클수록 느려짐

통합 테스트에 적합한 어노테이션


@RunWith(SpringRunner.class)를 붙여서 SpringJUnit4ClassRunner를 상속 받아 사용


@RunWith(SpringRunner.class)
@SpringBootTest(value = "value=test", classes = {TestApplicationTests.class})
public class TestApplicationTests {

@Value("${value}")
private String value;

@Test
public void contextLoads() {
assertThat(value, is("test"));
}
}
@RunWith(SpringRunner.class)
@SpringBootTest(properties = {"property.value=propertyTest"}, classes = {TestApplicationPropertyTests.class})
public class TestApplicationPropertyTests {

@Value("${property.value}")
private String propertyValue;

@Test
public void isEqualPropertyValue() {
assertThat(propertyValue, is("propertyTest"));
}

}

- value : 테스트가 실행되기 전에 적용할 프로퍼티를 주입.

- properties: 테스트가 실행되기 전에 {key=value} 형식으로 프로퍼티를 추가



@WebMvcTest

@WebMvcTest는 웹에서 테스트 하기 힘든 컨트롤러를 테스트하는 데 적합.(테스트하고자 하는 특정 컨트롤러명을 명시해 두어야 함)

웹상에서 응답과 요청에 대한 테스트를 진행.

- MockMvc는 컨트롤러 테스트 시, 모든 의존성을 로드하는 것이 아닌 명시된(BookController) 클래스 관련 빈만 로드하여 가벼운 MVC 테스트를 수행

=> 전체 HTTP 서버를 실행하지 않고 테스트를 할 수 있음


@RunWith(SpringRunner.class)
@WebMvcTest(BookController.class)
public class BookControllerTest {

@Autowired
private MockMvc mvc;

@MockBean
private BookService bookService;

@Test
public void Book_MVC_테스트() throws Exception {
Book book = new Book("Spring Boot Book", LocalDateTime.now());
given(bookService.getBookList()).willReturn(Collections.singletonList(book));

mvc.perform(get("/books"))
.andExpect(status().isOk()) // status? 200
.andExpect(view().name("book")) // return view? book
.andExpect(model().attributeExists("bookList")) // model property exist? bookList
.andExpect(model().attribute("bookList", contains(book))); // bookList contains? book
}
}


@service의 경우, @WebMvcTest의 적용 대상이 아니기 때문에 @MockBean으로 객체를 대체


check

- status ? 200

- viewName ? book

- model property Exist? bookList

- bookList contain ? book


@DataJpaTest


@DataJpaTest는 JPA 관련된 테스트 설정만 로드

기본적으로 인 메모리 데이터베이스를 사용(h2)

테스트가 끝날때마다, 테스트에 사용된 데이터를 롤백하여 줌


@RunWith(SpringRunner.class)
@DataJpaTest
public class BookJpaTest {
private final static String BOOT_TEST_TITLE = "Spring Boot Test Book";

@Autowired
private TestEntityManager testEntityManager;

@Autowired
private BookRepository bookRepository;

@Test
public void Book_저장하기_테스트() {
Book book = Book.builder().title(BOOT_TEST_TITLE).
publishedAt(LocalDateTime.now()).build();
testEntityManager.persist(book);
assertThat(bookRepository.getOne(book.getIdx()), is(book));
}

@Test
public void BookList_저장하고_검색_테스트() {
Book book1 = Book.builder().title(BOOT_TEST_TITLE).
publishedAt(LocalDateTime.now()).build();
testEntityManager.persist(book1);
Book book2 = Book.builder().title(BOOT_TEST_TITLE+"2").
publishedAt(LocalDateTime.now()).build();
testEntityManager.persist(book2);
Book book3 = Book.builder().title(BOOT_TEST_TITLE+"3").
publishedAt(LocalDateTime.now()).build();
testEntityManager.persist(book3);

List<Book> bookList = bookRepository.findAll();
assertThat(bookList, hasSize(3));
assertThat(bookList, contains(book1, book2, book3));
}
}


@DataJpaTest 사용할 경우에 TestEntityManager 클래스가 자동으로 빈으로 등록 됨. 

위와 같이 TestEntityManager 주입받아서 사용하면 된다. Jpa EntityManager와는 다르게 메서드가 많이 없지만 테스트하기에는 불편함이 없다.


만약, 인메모리 데이터베이스가 아닌 실메모리 데이터베이스를 사용하고자 한다면 아래와 같이 설정하여 주면 된다.

Replace,NONE으로 설정하면 @ActiveProfiles에서 설정한 프로파일이 적용 됨.


@ActiveProfiles("sample")
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)



@RestClientTest


@RestClientTest는 Rest 관련 테스트를 도와주는 어노테이션

Rest 통신의 데이터형으로 사용되는 JSON 형식을 테스트


@RunWith(SpringRunner.class)
@RestClientTest(BookRestService.class)
public class BookRestTest {

@Autowired
private BookRestService bookRestService;

@Autowired
private MockRestServiceServer server;

@Test
public void rest_테스트() {
this.server.expect(requestTo("/rest/test"))
.andRespond(withSuccess(new ClassPathResource("/test.json",
getClass()), MediaType.APPLICATION_JSON));
Book book = this.bookRestService.getRestBook();
assertThat(book.getTitle()).isEqualTo("테스트");
}
}

@RestClinentTest는 대상이 되는 BookRestService를 객체로 주입

MockRestServiceServer는 지정된 경로에 반환되는 예상값을 명시해 줌


@JsonTest


@JsonTest는 JSON의 직렬화와 역직렬화를 수행하는 라이브러리인 Gson과 Jackson API의 테스트를 제공


@RunWith(SpringRunner.class)
@JsonTest
public class BookJsonTest {

@Autowired
private JacksonTester<Book> json;

@Test
public void json_테스트() throws Exception {
Book book = Book.builder()
.title("테스트")
.build();
String content = "{\"title\":\"테스트\"}";

assertThat(this.json.parseObject(content).getTitle()).isEqualTo(book.getTitle());
assertThat(this.json.parseObject(content).getPublishedAt()).isNull();

assertThat(this.json.write(book)).isEqualToJson("/test.json");
assertThat(this.json.write(book)).hasJsonPathStringValue("title");
assertThat(this.json.write(book)).extractingJsonPathStringValue("title")
.isEqualTo("테스트");
}
}

- JacksonTester의 parseObject를 통해 content를 객체로 변환.


[출처]


처음으로배우는 스프링부트2

블로그 이미지

사용자 yhmane

댓글을 달아 주세요