MockMvc 를 사용 하여 controller 계층 단위 테스트 트 랜 잭 션 자동 스크롤 백 을 진행 하 는 전체 사례
package com.ieou.ms_backend.controller;
import com.google.gson.Gson;
import com.ieou.ms_backend.dto.account.CreateAccountReq;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MockMvcBuilder;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.ResultMatcher;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.WebApplicationContext;
import static org.junit.Assert.*;
/**
* created by wyz on 2019/5/6
*/
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class AccountControllerTest {
@Autowired
private WebApplicationContext wac;
private MockMvc mockMvc;
private String url = "/ms_backend/account/";
@Before
public void setUp() throws Exception{
// MockMvc
mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
}
//GET
@Test
public void accountList() throws Exception {
MockHttpServletRequestBuilder mockHttpServletRequestBuilder = MockMvcRequestBuilders.get(url + "accountList")
.param("companyName", "wang")
.header("access_token", "accessToken");
mockHttpServletRequestBuilder.accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.APPLICATION_JSON_UTF8);
ResultActions resultActions = mockMvc.perform(mockHttpServletRequestBuilder);
resultActions.andReturn().getResponse().setCharacterEncoding("UTF-8");
resultActions.andExpect(MockMvcResultMatchers.status().isOk());
resultActions.andDo(MockMvcResultHandlers.print());
}
@Test
public void removeAccount() {
}
//post @RequestBody
@Test
@Transactional
@Rollback() // , true。
public void createAccount() throws Exception {
CreateAccountReq req = new CreateAccountReq();
MockHttpServletRequestBuilder mockHttpServletRequestBuilder = MockMvcRequestBuilders.post(url + "createAccount")
.header("access_token", "accessToken");
mockHttpServletRequestBuilder.accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.APPLICATION_JSON_UTF8)
.content(new Gson().toJson(req)); // post
ResultActions resultActions = mockMvc.perform(mockHttpServletRequestBuilder);
resultActions.andReturn().getResponse().setCharacterEncoding("UTF-8");
resultActions.andExpect(MockMvcResultMatchers.status().isOk());
resultActions.andDo(MockMvcResultHandlers.print());
}
}
Spring-test 유닛 테스트 데이터 가 자동 으로 스크롤 백 되 지 않 는 솔 루 션JUnit 을 사용 하여 유닛 테스트 를 할 때 테스트 데이터 가 데이터 베 이 스 를 오염 시 키 지 않도록 spring-test 를 선택 하여 유닛 테스트 를 진행 하 였 으 나,dao 층 의 테스트 를 진행 할 때 save 방법 은 데이터 의 자동 스크롤 백 을 할 수 없 음 을 발견 하 였 다.
하나하나 검사 분석 을 진행 하면 서 트 랜 잭 션 도 열 리 고 주석 방식 으로@RollBack(true)을 표시 하 며 콘 솔 에서 도 트 랜 잭 션 스크롤 백 메 시 지 를 보 냈 지만 자동 으로 스크롤 백 할 수 없 었 습 니 다.
나중에 데이터베이스 의 원인 이 라 고 느 꼈 습 니 다.제 데이터 베 이 스 는 MySql 을 사 용 했 습 니 다.이것 은 데이터 시트 의 유형 이 사 무 를 지원 하 는 지 여부 입 니 다.
MySql 관련 문 서 를 살 펴 보면 InnoDB 유형의 표 는 사 무 를 지원 하 는 것 이 고 MyISAM 은 사 무 를 지원 하지 않 는 것 으로 나 타 났 습 니 다.바로 데이터 시트 유형 을 살 펴 보 니 역시 MyISAM 이 었 습 니 다.InnoDB 로 바 꾼 후에 다시 테스트 를 하여 문제 가 해결 되 었 습 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MockMvc 를 사용 하여 controller 계층 단위 테스트 트 랜 잭 션 자동 스크롤 백 을 진행 하 는 전체 사례JUnit 을 사용 하여 유닛 테스트 를 할 때 테스트 데이터 가 데이터 베 이 스 를 오염 시 키 지 않도록 spring-test 를 선택 하여 유닛 테스트 를 진행 하 였 으 나,dao 층 의 테스트 를 진행 할...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.