Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

Junit-1 본문

Spring Boot

Junit-1

Seung__ 2021. 5. 22. 00:55

Junit이란? 자바용 단위 테스트 도구!

 

* TDD(Test-driven Development)

  테스트 주도 개발에서 사용하지만, 코드의 유지 보수 및 운영 환경에서의 에러를 미리 방지하기 위해서 다누이 별로 검증하는 테스트 프레임워크를 말함

 

* 단위 테스트

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

 

* JUnit 자바 기반의 단위 테스트를 위한 프레임 워크

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

 

* Assertion : 가정 설정문, 참 거짓을 미리 가정하는 문.

 

JUnit을 사용하기 위해서는 dependency에 아래와 같이 추가되어 있어야 함!

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

JUnit 사용 연습을 위해 다음과 같이 프로젝트를 구성할 것이다.

 

1. interface ICalculator : sum, minus 기능 표기?

public interface ICalculator {

    int sum(int x, int y);
    int minus(int x, int y);
}

2.  class MarkerAPi : 대충 환율 불러오는 기능 

public class MarketApi {

    public int connect(){

        return 1100;
    }
}

3. class DollarCalculator implements ICalculator

public class DollarCalculator implements ICalculator{

    private int price = 1;

    private MarketApi marketApi;

    //외부로부터 주입받자.
    public DollarCalculator(MarketApi marketApi){
        this.marketApi = marketApi;
    }

    public void init(){
        this.price = marketApi.connect();
    }

    @Override
    public int sum(int x, int y) {
        x *=price;
        y*=price;
        return x+y;
    }

    @Override
    public int minus(int x, int y) {
        x *=price;
        y*=price;
        return x-y;
    }
}

4. class KrwCalculator implements ICalculator : 원화로 기능 

public class KrwCalculator implements ICalculator{

    private int price = 1;

    @Override
    public int sum(int x, int y) {
        x *=price;
        y *=price;
        return x+y;
    }

    @Override
    public int minus(int x, int y) {
        x *=price;
        y *=price;
        return x-y;
    }
}

5. class Calculator : calculator에 dollarCalculator를 주입하거나, KrwCalculator 주입하여 사용 

public class Calculator {

    private ICalculator iCalculator;

    public Calculator(ICalculator iCalculator){
        this.iCalculator = iCalculator;
    }

    public int sum(int x, int y){
        return this.iCalculator.sum(x, y);
    }

    public int minus(int x, int y){
        return this.iCalculator.minus(x, y);
    }
}

 

6 class Main : 대충 계산기 사용하는 코드

public class Main {

    public static void main(String[] args) {
        System.out.println("hello Junit");
        MarketApi marketApi = new MarketApi();
        DollarCalculator dollarCalculator = new DollarCalculator(marketApi);
        dollarCalculator.init();

		//calcualtor에 dollarCalculator 주입
        Calculator calculator = new Calculator(dollarCalculator);

        System.out.println(calculator.sum(10,10));



    }
}

 

이렇게 Main에서 코드를 구성하고 시행하여 에러를 찾을 수 도 있지만....test를 만들어서 찾아봅시다!!

 

7. test 만들기 

요렇게 테스트를 생성해준다.

테스트를 하기 원하는 method에 @Test를 붙여줘야 한다.

 @Test
    public void testHello(){
        System.out.println("test hello");
    }

 

8. 내가 예상하는 값으로 나오는지 확인하는 방법! : Assertion.assertEquals(예상 값, method)

Assertions.assertEquals(22000, calculator.sum(10,10))

: clculator.sum(10, 10)을 수행한 결과가 22000이랑 같음???

 @Test
    public void dollarTest(){
        MarketApi marketApi = new MarketApi();
        DollarCalculator dollarCalculator = new DollarCalculator(marketApi);
        dollarCalculator.init();

        Calculator calculator = new Calculator(dollarCalculator);

        System.out.println(calculator.sum(10,10));

        Assertions.assertEquals(22000, calculator.sum(10,10));
        Assertions.assertEquals(0, calculator.minus(10,10));
    }

결과가 일치하면 콘솔 창에서 통과했다고 알려준당.

 

9. @Mock

marketApi는 환율을 가져오는 기능을 제공한다.  근데 환율을 계속 변하는데..????

환율에 계속 달라져도 method들이 잘 작동하는 지 확인하고 싶어.. @Mock을 사용하자.

 

목업을 만드는 것 처럼 객체도 목업을 만들 수 있다. 즉 가짜 객체? 모의객체를 @Mock을 통해 만들 수 있다.

 

mocking처리를 하자! 이를 위해서는 class에 @ExtendWith(Mockito)를 붙여줘야 하고

 

dependency 에 아래와 같이 추가해줘야 함.

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

테스트 코드를 작성해보자.

@ExtendWith(MockitoExtension.class)
public class DollarCalculatorTest {

    @Mock //marketApi객체 mocking처리! 
    public MarketApi marketApi;

    @BeforeEach //테스트 실행되기 이전에
    public void init(){
        Mockito.lenient().when(marketApi.connect()).thenReturn(3000);//.connect가 호출이 될때 3000으로 리턴
    }
    
        @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));
    }
}

* @BeforeEach : 각 test실행되기 전에 실행되게 해줌.

  @BeforeEach is used to signal that the annotated method should be executed before each @Test,

  @RepeatedTest, @ParameterizedTest, @TestFactory, and @TestTemplate method in the current test class.

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

Swagger  (0) 2021.05.30
Mock MVC  (0) 2021.05.22
Lombok  (0) 2021.05.22
JUnit-3 : Jacoco  (0) 2021.05.22
JUnit-2(spring, lombok 활용)  (0) 2021.05.22
Comments