SpringBoot 프로젝트 에서 Mockito 의 예제 코드 를 사용 합 니 다.
9636 단어 SpringBootMockito
소프트웨어 개발 을 할 때 우 리 는 많은 코드 를 쓸 것 입 니 다.그러나 6 개 월 만 지나 면(심지어 1 년 이상)자신의 코드 가 어떻게 작 동 하 는 지 아 십 니까?테스트(유닛 테스트,통합 테스트,인터페이스 테스트)를 통 해 시스템 의 유지 가능성 을 확보 할 수 있 습 니 다.일부 코드 를 수정 할 때 회귀 테스트 를 통 해 새로운 bug 가 도입 되 었 는 지 확인 할 수 있 습 니 다.어쨌든 테스트 는 시스템 이 더 이상 블랙박스 가 아니 라 개발 자 들 로 하여 금 시스템 이 사용 가능 하 다 는 것 을 확인 하 게 해 야 한다.
웹 응용 프로그램 에서 컨트롤 러 층 에 대한 테스트 는 일반적으로 두 가지 방법 이 있 습 니 다.(1)http 요청 을 보 냅 니 다.(2)http 요청 대상 을 모 의 한다.첫 번 째 방법 은 회귀 환경 을 설정 하고 코드 통 계 를 수정 하 는 전략 을 통 해 도달 율 을 계산 해 야 한다.두 번 째 방법 은 비교적 정규 적 인 사고 이지 만 제 가 현재 겪 은 프로젝트 에서 많이 사용 하지 않 았 습 니 다.오늘 은 Mock 대상 으로 Controller 층 의 코드 를 어떻게 테스트 하 는 지 정리 하 겠 습 니 다.
이전 몇 편의 글 에서 저 희 는 모두 bookpub 이라는 프로그램 을 예 로 들 었 습 니 다.오늘 도 예 외 는 아 닙 니 다.제 공 된 RESTful 인터페이스 가 정확 한 응답 데 이 터 를 되 돌 릴 수 있 는 지 테스트 하려 고 합 니 다.이러한 테스트 는 유닛 테스트 와 달리 완전한 응용 프로그램 컨 텍스트 를 초기 화하 고 모든 spring bean 을 짜 고 데이터 베이스 에 테스트 데이터 가 필요 합 니 다.일반적으로 이러한 테스트 를 통합 테스트 나 인터페이스 테스트 라 고 합 니 다.
실전
spirng.io 를 통 해 새로 만 든 Spring Boot 프로젝트 는 빈 테스트 파일 인 BookPubApplicationTest.java 를 제공 합 니 다.내용 은:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = BookPubApplication.class)
public class BookPubApplicationTests {
@Test
public void contextLoads() {
}
}
pom 파일 에 spring-boot-starter-test 의존 도 를 증가 시 키 고 jsonPath 의존 도 를 추가 합 니 다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
</dependency>
BookPubApplicationTest 에 테스트 용례 를 추가 합 니 다.
package com.test.bookpub;
import com.test.bookpub.domain.Book;
import com.test.bookpub.repository.BookRepository;
import org.junit.Before;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.boot.test.TestRestTemplate;
import org.springframework.boot.test.WebIntegrationTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.context.WebApplicationContext;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.hamcrest.Matchers.containsString;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = BookPubApplication.class)
@WebIntegrationTest("server.port:0")
public class BookPubApplicationTests {
@Autowired
private WebApplicationContext context;
@Autowired
private BookRepository bookRepository;
@Value("${local.server.port}")
private int port;
private MockMvc mockMvc;
private RestTemplate restTemplate = new TestRestTemplate();
@Before
public void setupMockMvc() {
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
}
@Test
public void contextLoads() {
assertEquals(1, bookRepository.count());
}
@Test
public void webappBookIsbnApi() {
Book book = restTemplate.getForObject("http://localhost:" + port +"/books/9876-5432-1111", Book.class);
assertNotNull(book);
assertEquals(" ", book.getPublisher().getName());
}
@Test
public void webappPublisherApi() throws Exception {
//MockHttpServletRequestBuilder.accept
//MockHttpServletRequestBuilder.contentType, Content-Type ,
mockMvc.perform(get("/publishers/1")
.accept(MediaType.APPLICATION_JSON_UTF8))
.andExpect(status().isOk())
.andExpect(content().string(containsString(" ")))
.andExpect(jsonPath("$.name").value(" "));
}
}
spring boot 프로젝트 의 코드 보급률cobertura 를 사용 하여 프로젝트 의 github 주 소 를 참고 하 십시오spring boot template
# To create test coverage reports (in target/site/cobertura)
mvn clean cobertura:cobertura test
분석 하 다.
먼저 BookPubApplications Tests 클래스 에 사 용 된 주 해 를 분석 합 니 다.
모든 테스트 용례 는@Test 주해 로 수식 합 니 다.첫 번 째 테스트 사례 인 contextLoads()방법 에서 저 는 BookRepository 연결 이 이미 구축 되 었 고 데이터 베이스 에 해당 하 는 테스트 데 이 터 를 포함 하고 있 음 을 확인 해 야 합 니 다.
두 번 째 테스트 용례 는 우리 가 제공 한 RESTful URL 을 테스트 하 는 데 사 용 됩 니 다.ISBN 을 통 해 책 한 권 을 조회 합 니 다.즉,"/books/{isbn}"입 니 다.이 테스트 용례 에서 우 리 는 TestRestTemplate 대상 을 사용 하여 RESTful 요청 을 합 니 다.
세 번 째 테스트 사례 에 서 는 MockMvc 대상 을 통 해 두 번 째 테스트 와 유사 한 기능 을 실현 하 는 방법 을 보 여 주 었 다.Spring 테스트 프레임 워 크 는 MockMvc 대상 을 제공 합 니 다.클 라 이언 트-서버 요청 이 필요 없 이 MVC 테스트 를 할 수 있 습 니 다.서버 쪽 에서 Controller 요청 을 수행 할 수 있 습 니 다.테스트 서버 를 시작 한 것 과 같 습 니 다.
테스트 가 시작 되 기 전에 테스트 환경 을 만들어 야 합 니 다.setup 방법 은@Before 에 의 해 수 정 됩 니 다.MockMvcBuilders 도 구 를 통 해 WebApplication Context 대상 을 매개 변수 로 하여 MockMvc 대상 을 만 듭 니 다.
MockMvc 대상 은 assert 판단 을 수행 하 는 도구 함 수 를 제공 합 니 다.모두 웹 요청 에 대한 판단 입 니 다.이 도구 의 사용 방식 은 함수 의 체인 호출 입 니 다.프로그래머 가 여러 개의 테스트 용례 를 연결 하고 여러 개의 판단 을 할 수 있 도록 합 니 다.이 예 에서 우 리 는 아래 의 도구 함수 들 을 사용한다.
질문 설명:spring-boot-starter-data-rest 를 통 해 만 든 reposcory 에서 꺼 낸 한 자 는 어 지 러 운 코드 입 니 다
@Test
public void webappPublisherApi() throws Exception {
//MockHttpServletRequestBuilder.accept
//MockHttpServletRequestBuilder.contentType, Content-Type ,
mockMvc.perform(get("/publishers/1")
.accept(MediaType.APPLICATION_JSON_UTF8))
.andExpect(status().isOk())
.andExpect(content().string(containsString(" ")))
.andExpect(jsonPath("$.name").value(" "));
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Java・SpringBoot・Thymeleaf】 에러 메세지를 구현(SpringBoot 어플리케이션 실천편 3)로그인하여 사용자 목록을 표시하는 응용 프로그램을 만들고, Spring에서의 개발에 대해 공부하겠습니다 🌟 마지막 데이터 바인딩에 계속 바인딩 실패 시 오류 메시지를 구현합니다. 마지막 기사🌟 src/main/res...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.