티스토리 뷰

반응형

기능에 대한 단위테스트를 진행하는데 있어, 다른 기능들이 물려있는 경우, stub 방식으로 대신 제공하여, 필요한 기능만 집중으로 테스트할 수 있다. 

 

※ Stub : 대역( 실제 구현을 대신하여 사용할 구현 ) 종류에 하나로 구현을 최대한 단순화시킨 것이다.

 

 

테스트 기반의 개발을 해보고 싶어 요즘 TDD에 대한 공부를 하고 있다.. 이전에도 혼자서 테스트해본다고 이것저것 건드렸는데... 뭐든 잘 모르고 쓰면 문제가 발생한다.

본 글은 Mockito를 이용하여 단위테스트를 진행하면서 발생한 문제에 대한 해결법을 작성한 것이다.

 


 

상황

Controller 클래스의 특정 기능을 테스트하였다. 해당 기능은 Service 의 특정 기능에 의존해 있다.

그렇기 때문에 BDDMockito 에서 제공하는 given을 이용하여 Service의 특정 기능을 대체 구현하여 테스트를 진행하였다. 

 

 

 

문제점

분명 given을 이용하여 대체 구현을 만들었는데, 대체 구현된 내용이 아닌 실제 구현 메소드가 실행되어, 테스트에 계속해서 실패하였다.

분명히, 의존대상이 되는 Service는 @Mock 으로  생성하였고, 테스트 대상이 되는 Controller는 객체는 @InjectMocks 으로 어노테이션을 다 달아줬는데... ?

 

 

 

 

해결방법

1 ) 어노테이션 사용 

@Mock, @InjectMocks 이 정상동작하지 않은 것이었고, 해당 기능이 제대로 동작하려면 테스트 클래스에 @ExtendWith(MockitoExtension.class) 를 추가해줘야 했다.

 

※ Mock : Mock 객체를 자동적으로 생성해주는 어노테이션

※ InjectMocks : 생성된 Mock 객체를 사용하고 있는 객체에게 주입한다는 어노테이션

@ExtendWith({MockitoExtension.class})
class TestControllerTest {

    @Mock
    TestService testService;

    @InjectMocks
    TestController testController;
    
    ...
    
}

 

2) 직접 생성

만약, 해당 어노테이션을 사용하지 않고 Mock객체를 테스트 대상 객체에 직접 주입하여 사용하고 싶다면, 아래와 같이 직접 Mock 객체를 생성해서 테스트 대상 클래스 생성자에 추가하는 방법도 있다.

class TestControllerTest {

  
    TestService testService;

    TestController testController;

    @BeforeEach
    void setUp(){
        testService = Mockito.mock(TestService.class);
        testController = new TestController(testService);
    }
    
    ...
    
}

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/10   »
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
글 보관함