이것저것 해보기🌼

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

BE/Spring Boot

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

realtree 2021. 7. 6. 15:34

TDD(Test-driven Development)

코드의 유지보수 및 운영환경에서 에러를 미리 방지하기 위해 단위별로 검증하는 테스트 프레임워크

 

단위테스트

작성한 코드가 기대하는대로 동작하는지 검증하는 절차

 

JUnit

JAVA 기반의 단위테스트를 위한 프레임워크.

Annotation 기반으로 테스트를 지원하며, Assert를 통하여 (예상, 실제) 검증

 

 

 

 

Gradle Java Project 에서 test 하기

 

Mock 사용을 위해서는 아래 추가적인 dependencies가 필요하다.

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'

    testImplementation group: 'org.mockito', name: 'mockito-core', version: '3.11.2'
    testImplementation group: 'org.mockito', name: 'mockito-junit-jupiter', version: '3.11.2'

}

 

테스트코드:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
 
@ExtendWith(MockitoExtension.class)
public class DollarCalculatorTest {
 
    @Mock
    public MarketApi marketApi;
 
    @BeforeEach
    public  void init(){
        Mockito.lenient().when(marketApi.connect()).thenReturn(3000);
    }
 
    @Test
    public void testHello(){
        System.out.println("hello");
    }
 
    @Test
    public void DollarTest(){
 
        DollarCalculator dollarCalculator = new DollarCalculator(marketApi);
        dollarCalculator.init();
 
        Calculator calculator = new Calculator(dollarCalculator);
        Assertions.assertEquals(60000, calculator.sum(10,10));
        Assertions.assertEquals(0, calculator.minus(10,10));
    }
 
    @Test
    public void MockTest(){
 
        DollarCalculator dollarCalculator = new DollarCalculator(marketApi);
        dollarCalculator.init();
 
        Calculator calculator = new Calculator(dollarCalculator);
        System.out.println(calculator.sum(10,10));
        Assertions.assertEquals(60000, calculator.sum(10,10));
        Assertions.assertEquals(0, calculator.minus(10,10));
    }
}
 
cs

 

@BeforeEach 아래를 보면, connect() 함수가 호출될때 값을 무조건 3000으로 넣어서 테스트가 가능하다.

원래 connect() 함수의 결과와 다르게 내가 직접 값을 지정하고싶을때 Mockito를 활용해 이러한 방식의 테스트가 가능하다.

 

 

 

 

 

Spring Project 에서 CRUD 테스트하기

 

1) 기본 Mock 테스트

통합테스트 : @SpringBootTest

단위테스트 : @Import( 원하는 클래스 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@SpringBootTest
//@Import({MarketApi.class, DollarCalculator.class})
public class DollarCalculator {
 
    @MockBean
    private MarketApi marketApi;
 
    @Autowired
    private DollarCalculator dollarCalculator;
 
    @Test
    public void dollarCalculatorTest(){
       Mockito.when(marketApi.connect()).thenReturn(3000);
 
       dollarCalculator.init();
       int sum = dollarCalculator.sum(10,10);
       int minus = dollarCalculator.minus(10,10);
 
        Assertions.assertEquals(60000,sum);
        Assertions.assertEquals(0,minus);
    }
}
 
cs

 

2) GET 테스트

GET 방식에 대해 굳이 웹 실행을 하지 않고 TEST 하는 방법

@WebMvcTest( 원하는 클래스 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
@WebMvcTest(CalculatorApiController.class)
@AutoConfigureWebMvc
@Import({Calculator.class, DollarCalculator.class})
public class CalculatorControllerTest {
 
    @MockBean
    private MarketApi marketApi;
 
    @Autowired
    private MockMvc mockMvc;
 
    @BeforeEach
    public  void init(){
        Mockito.when(marketApi.connect()).thenReturn(3000);
    }
 
 
    public void sumTest(){  //http://localhost:8080/api/sum
 
            mockMvc.perform(
                    MockMvcRequestBuilders.get("http://localhost:8080/api/sum")
                            .queryParam("x","10")
                            .queryParam("y","10")
            ).andExpect(
                    MockMvcResultMatchers.status().isOk()
            ).andExpect(
                    MockMvcResultMatchers.content().string("60000")
            ).andDo(MockMvcResultHandlers.print());
     
    }
 
}
cs

위와 같은 방식으로 REST API 호출을 하지 않고도, parameter x, y에 각각 10, 10을 직접 넣어서 테스트가 가능하다.

응답이 기댓값 60000과 같은지 확인해보는 테스트 코드이다. 

 

DELETE 에도 동일한 방식으로 테스트가 가능하다.

 

 

'BE > Spring Boot' 카테고리의 다른 글

[웹] 세션  (0) 2021.08.29
[프로그래머스 과제관] 주문 관리 API 서버 개발  (6) 2021.07.08
[Open API] 네이버 Open API 사용하기  (0) 2021.07.06
Validation, Exception 처리하기  (0) 2021.07.05
Annotation 정리  (0) 2021.07.05