본문 바로가기

명사 美 비격식 (무리 중에서) 아주 뛰어난[눈에 띄는] 사람[것]

JAVA/Spring

EasyMock + JUnit 테스트 @Before @Test

앞서 JUnit테스트를 진행해봤다.

https://standout.tistory.com/1139

 

JUnit 테스트 : @Before @After @Test

간단한 JUnit 테스트를 진행해보자. https://standout.tistory.com/378 junit 4.7 이란? 단위테스트 프레임워크, 코드수행결과를 확인해 코드의 정확성/신뢰성을 검증하는 기능 pom.xml에 추가 junit junit 4.7 test ht

standout.tistory.com

 

EasyMock을 함께하면 보다 복잡한 구조도 비교적 안정적으로 테스트해볼 수 있다.

https://standout.tistory.com/1143

 

EasyMock이란?

EasyMock java언어를 기반으로 하는 Mock객체를 생성하고 관리하는데 사용하는 프레임워크중 하나 JUnit 및 TestNG와 같은 테스트 프레임워크와 쉽게 통합된다. https://standout.tistory.com/1142 Mock 객체란? 간

standout.tistory.com

 

 

진행해보자.

우선 easymock 라이브러리를 maven에 추가한다.

<dependency>
    <groupId>org.easymock</groupId>
    <artifactId>easymock</artifactId>
    <version>4.2</version> <!-- Use the latest version -->
    <scope>test</scope>
</dependency>

 

 

 

간단한 JUnit에 사용했던 hiSanghee 메소드를 한번더 활용할것이다.

여기에 간순한 String 출력이 아닌 Service단 메소드를 추가했다.

Service 메소드는 SampleVO형 vo를 가져다 select한 결과물을 반환할것이다.

public String hiSanghee(SampleVO vo) {
		try {
			SampleVO resultVO = sampleService.selectSample(vo);
			return ""+vo.getName() + "가 작성했습니다. \nselectSample에서는 \n" + resultVO +"\n를 받았습니다." ;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return "예외가 발생했습니다.";
		}
	}

 

 

 

기존 test폴더에 java class를 하나더 추가해보자.

EasyMock과 JUnit을 import하자.

package egovframework.example.sample.web;

import static org.easymock.EasyMock.*;
import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;

import egovframework.example.sample.service.EgovSampleService;
import egovframework.example.sample.service.SampleVO;


public class EgovSampleControllerTest {
	//mock은 외부의존성을 격리하고 테스트를 통제가능하게 하기 위함.
	//mock을 사용하지않는다면 실제 EgovSampleService를 호출하며 데이터베이스와 통신하게 된다.
	//이로인해 테스트는 더욱 복잡해지고 
	//테스트환경에 따라 결과가 다르거나 느릴 수 있으며 테스트가 실패할 수 있는 다양한 이유가 생기게된다.

    private EgovSampleController egovSampleController;
    private EgovSampleService sampleService;

    @Before
    public void setUp() {
    	//EgovSampleController객체, MOCK EgovSampleService 객체를 생성한다.
    	//EgovSampleService 객체를 EgovSampleController에 주입한다.
        egovSampleController = new EgovSampleController();
        sampleService = mock(EgovSampleService.class);
        System.out.println("■ mock()\n sampleService을 mock 객체로 생성했다.\n");
        egovSampleController.setSampleService(sampleService);
        System.out.println("■ set \nmock객체를 egovSampleController에 주입했다.\n");
    }

    @Test
    public void testHiSanghee() throws Exception {
        // Arrange
    	//SampleVO 객체를 생성하고 이름을 설정한다.
        SampleVO mockSampleVO = new SampleVO();
        mockSampleVO.setName("Sanghee");

        // Setup mock behavior
        //EgovSampleService의 selectSample메소드가 mockSampleVO와 일치하면 mockSampleVO를 반환한다.
        //설정한 행동을 재생한다.
        expect(sampleService.selectSample(eq(mockSampleVO))).andReturn(mockSampleVO);
        System.out.println("■ expect \n기존 selectSample가 대체한 mockSampleVO와 일치한다면 mockSampleVO를 반환한다.\n");
        replay(sampleService);

        // Act
        //EgovSampleController hiSanghee메소드를 호출하여 결과를 얻는다.
        System.out.println("■ Act 실행\n");
        String result = egovSampleController.hiSanghee(mockSampleVO);

        // Assert
        //예상한 결과와 일치하는지 확인한다.
        String expected = "Sanghee가 작성했습니다. \nselectSample에서는 \n" + mockSampleVO + "\n를 받았습니다.";
        System.out.println("■ assertEquals\n원하는결과: "+ expected+"\n");
        System.out.println("출력된 결과: " + result);
        assertEquals(expected, result);
        System.out.println("= 예상한 결과와 일치합니다.");
        
        //Mock 객체를 사용하여 메소드 호출이 예상대로 잘 이루어졌는지 확인
        verify(sampleService);
        System.out.println("\n■ verify\n메소드 호출이 예상대로 잘 이루어졌습니다.");

    }
}

 

 

사용될 Service, VO 또한 import하고, Controller 객체를 만들었다.

 

 

 

 

여기서 Service는 mock()로 생성, mock객체로 사용될것이다.

이 mock 객체 Service에 필자가 지정한 데이터가 사용된다.

 

 

hiSanghee를 테스트할 메소드 testHiSanghee를 생성하고

 

 

 

 

테스트한 데이터를 VO에 세팅한다.

 

 

 

 

실행전, mock 객체가 잘 만들었는지 확인한다.

즉 실제 Service메소드와 일치하는지 먼저 확인 한뒤 mock으로 실행할 수 있다.

 

 

 

지정한 데이터로 Controller의 hiSanghee를 실행한다.

 

 

 

테스트 결과를 예상하는 성공적인 결과와 비교할 수 있다.

예상한 결과와 다른값이 나온다면 테스트 실패가 뜰것이다.

 

 

 

 

지정한 Mock도 정상적으로 잘 실행이 되었는지 검증 할 수 있다.

Mock Service를 잘 활용하지 못했다면 오류가 날것이다.

 

 

 

테스트 실행

 

 

 

결과확인

 

 

완료.

 

 

 

 

 

+ 반대로 오류가 출력되는지 확인해보자.

*console에 나오는 메세지는 무시하자.

 

 

 

예상한 결과지를 망가뜨려보자.

결과를 출력하다 오류가 나며 진행되지않는다.

에러또한 예상한 답변과 다름을 경고한다.

 

 

 

이번에는 생성했던 mock()코드를 주석처리해보자.

mock을 인식하지못한 테스트 코드는 act 단계로 넘어가지못하며 테스트가 중단되는것을 확인 할 수 있다.