본문 바로가기
📚Framework & Library/JUnit

[JUnit] 테스트 코드 작성하기

by inbeom 2023. 9. 10.
728x90

 💡  Test 방법을 알아보자~!

웹 서버를 실행시켜 직접 사용해보지 않아도 테스트 클래스를 만들어 코드를 테스팅 해볼 수 있다.

 

Testing (Annotation)

@SpringBootTest

  • 통합 테스트를 제공하며, 애플리케이션에 설정된 빈을 모두 로드한다.

@Test

  • Test 메서드로 인식하고 테스트 한다.

@BeforeAll

  • 해당 테스트 클래스를 초기화할 때 딱 한번 수행되는 메서드다. (static 으로 선언해야한다)

@BeforeEach

  • 테스트 메서드 실행 이전에 수행된다.

@AfterAll

  • 해당 테스트 클래스 내 테스트 메서드를 모두 실행시킨 후 딱 한번 수행되는 메서드다. (static 으로 선언해야한다)

@AfterEach

  • 테스트 메서드 실행 이후에 수행된다.

@WebMvcTest(abc.class)

  • Controller를 테스트하는데 적합하며, 테스트할 클래스 지정한다.
  • 웹 상에서 요청 / 응답에 대해 테스트함.

@AutoConfigureWebMvc

  • Web과 관련된 자동 구성을 활성화하고 웹 레이어 만 활성화 합니다 .
  • SpringBootTest의 하위구성.

@Import({abc.class, qwer.class})

  • 테스트 시 필요한 클래스 가져오기

 

통합 테스트
  • 전체에 대한 통합 테스트 (무거움)
@SpringBootTest // SpringBootTest 어노테이션을 붙이면 모든 빈이 등록됨.

public class DollarCalculatorTest {

	@MockBean
	private MarketApi marketApi;

	@Autowired
	private Calculator calculator;

	@Test
	public void dollarCalculatorTest(){
		// connect가 발생될 때 3000을 return시키겠다.
		Mockito.when(marketApi.connect()).thenReturn(3000);
		int sum = calculator.sum(10, 10);
		int minus = calculator.minus(10, 10);

		Assertions.assertEquals(60000, sum);
		Assertions.assertEquals(0, minus);
	}
}

 

단위 테스트 (Get)
  • GetController메서드의 반환값 테스트
@WebMvcTest(CalculatorApiController.class)  // 테스트 할 클래스
@AutoConfigureWebMvc
@Import({Calculator.class, DollarCalculator.class}) // 테스트시 사용되는 클래스

public class CalculatorApiControllerTest {

	@MockBean
	private MarketApi marketApi;

	@Autowired
	private MockMvc mockMvc;

	@BeforeEach
	public void init(){
		Mockito.when(marketApi.connect()).thenReturn(3000);
	}

	@Test
	public void sumTest() throws Exception {
		// <http://localhost:8080/api/sum>

		mockMvc.perform(
			MockMvcRequestBuilders.get("<http://localhost:8080/api/sum>")
				.queryParam("x", "10")
				.queryParam("y", "10")
		).andExpect(    // 예상하다 - 상태가 OK
			MockMvcResultMatchers.status().isOk()
		).andExpect(    // 예상하다 - 내용이 "6000"
			MockMvcResultMatchers.content().string("60000")
		).andDo(MockMvcResultHandlers.print()); // 결과값을 출력

	}
}

 

단위 테스트 (Post)
  • PostController메서드의 반환값 테스트
@WebMvcTest(CalculatorApiController.class)  // 테스트 할 클래스
@AutoConfigureWebMvc
@Import({Calculator.class, DollarCalculator.class}) // 테스트시 사용되는 클래스

public class CalculatorApiControllerTest {

	@MockBean
	private MarketApi marketApi;

	@Autowired
	private MockMvc mockMvc;

	@BeforeEach
	public void init(){
		Mockito.when(marketApi.connect()).thenReturn(3000); // marketApi의 connect()메서드가 실행될 때 3000을 반환한다.
	}

	@Test
	public void minusTest() throws Exception {
		// <http://localhost:8080/api/sum>

		Req req = new Req();
		req.setX(10);
		req.setY(10);
		String json = new ObjectMapper().writeValueAsString(req);

		mockMvc.perform(
			MockMvcRequestBuilders.post("<http://localhost:8080/api/minus>")
			.contentType(MediaType.APPLICATION_JSON)
			.content(json)
		).andExpect(
			MockMvcResultMatchers.status().isOk()
		).andExpect(  // 예상하다 - Body(json)의 result의 결과값이 0이 나와야 한다.
			MockMvcResultMatchers.jsonPath("$.result").value("0")
		).andExpect(  // 예상하다 - Body(json)의 response.resultCode의 결과값 OK.
			MockMvcResultMatchers.jsonPath("$.response.resultCode").value("OK")
		)
		.andDo(MockMvcResultHandlers.print());
	}
}

 

728x90