[TDD] Junit4/Mockito 용어정리

minj-j·2024년 2월 26일
0

TDD

목록 보기
1/1

Mockito

mock : 모조품이라는 뜻
Mockito는 오픈소스 mock 프레임워크이다.
모조품이라는 뜻과 같이 테스트를 위한 가짜 객체를 만들어주는 프레임워크이다.

MockitoJUnitRunner

// 이렇게 사용
@RunWith(MockitoJUnitRunner.class)

Mockito가 제공하는 Junit 확장 클래스로써
JUnit4에서 Mockito를 사용하여 테스트 클래스를 실행할 수 있게 해준다

@InjectMocks

Mock 객체가 주입되어야 하는 필드를 표시하는데 사용한다.

public class MyServiceTest {

    @InjectMocks
    private MyController myController;

    @Mock
    private SomethingService somethingService;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testMyServiceMethod() {
        // 테스트 코드 작성
    }
}

MyController 클래스의 객체인 myController에 @InjectMocks이,
SomethingService 클래스의 객체인 somethingService 필드에는
@Mock 애노테이션이 지정되어 있다.

이렇게 함으로써 myController에 객체에는 자동으로 목 객체인 somethingService가 주입되어 테스트를 수행할 수 있게 된다.

때문에 @InjectMocks를 사용하면

public class MyTest {

    private MyController myController에; // 주입할 대상 객체
    private SomethingService somethingService; // 의존 객체

    @Before
    public void setup() {
        somethingService = new SomethingService(); // 명시적으로 의존 객체 생성
        myController에 = new MyController(somethingService); // 의존 객체를 주입하여 MyController 객체 생성
    }

    @Test
    public void testSomeMethod() {
        // userService의 메서드를 호출하고 테스트 진행
    }
}

이렇게 일일이 의존객체를 주입해 줄 필요가 없다는 것이다.

@Mock

Mockito 프레임워크에서 사용되며, Mock 객체를 생성하는데 쓰인다.
Mock 객체는 실제 객체와 유사하게 동작하나,
개발자가 직접 제어할 수 있는 "가짜"객체이다.

Mock 어노테이션을 사용하여 Mock 객체를 생성할 수 있다
이렇게 생성된 Mock 객체는 실제 객체의 동작을 흉내낸다.
개발자는 객체의 동작을 원하는 대로 설정할 수 있다.

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

@Mock
// SomethingService라는 클래스를 테스트 하기 위해 somthingService라는 가짜 객체를 만들었다. 
SomethingService somthingService;

@TEST

테스트 메서드임을 알리는 어노테이션

Mockito.when()

Mock 객체의 동작을 설정하기 위해 사용되는 메서드
특정한 메서드가 호출될 때, 어떤 동작을 하라~ 라고 정의할 수 있다.

단위 테스트시 TEST Stub을 만들 수 있게 해준다.
* stub : 테스트 대상 모듈에 의해 호출되는 프로그램

when의 메서드 3가지(추후 추가예정)

1) thenReturn()
Mock 객체의 특정 메서드 호출에 대한 반환 값을 설정하는데 사용한다.
이때, 반환 값은 특정 메서드가 return하는 값의 형식과 일치해야 한다.
@TEST
public void 테스트_메서드() throws Exception {
	/* somthingService의 selectSomeList()라는 메서드는
    return pageInfo를 반환한다고 가정하자*/

	PageInfo pageInfo = new PageInfo();
	Mockito.when(somthingService.selectSomeList()).thenReturn(pageInfo);
    
    /* 이런 식으로 thenReturn에는 selectSomeList() 라는
    해당 메서드의 반환형식과 일치하도록 하여 
    테스트 메서드에서의 반환 값을 결정할 수 있다.
    다른 형식은 안됨.
    */
}
2) thenAnswer()
3) 

개인적으로 이걸 왜 쓰지 했는데 챗지피티가 잘 말해줘서
인상깊었던 이유 2개 들고와 봤다.

1) 의도한 테스트 시나리오 정의: 목 객체를 사용하여 실제 코드와의 상호작용을 시뮬레이션할 때, 특정 메서드 호출에 대한 반환 값을 설정하여 특정 상황에서 어떻게 동작해야 하는지 명확하게 정의할 수 있습니다.
2) 의존성 관리: 테스트 대상 클래스가 다른 클래스나 서비스와 의존성을 갖는 경우, 이러한 의존성을 목 객체로 대체하여 테스트를 단순화할 수 있습니다. 이 때 when() 메서드를 사용하여 의존하는 메서드 호출에 대한 반환 값을 제어할 수 있습니다.

Mockito.verify()

Mock 객체의 메서드가 특정한 방식으로 호출되었는지를 검증할 수 있다.

// 기본적인 사용법..
verify(mockObject, verificationMode).methodCall();

@TEST
public void 테스트_메서드() throws Exception {
	PageInfo pageInfo = new PageInfo();
	Mockito.when(somthingService.selectSomeList()).thenReturn(pageInfo);
    
    //Mockito.times(n) : Mock 객체의 특정 메서드(selectSomeList) 호출이 n만큼 이루어 졌는가를 확인
    Mockito.verify(somthingService, Mockito.times(1)).selectSomeList();
    // => somthingService라는 Mock객체에서 selectSomeList라는 메서드가 1번 호출이 되었는가 
}

Junit4

JAVA용 단위 테스트 프레임워크

@RunWith

해당 테스트 클래스를 실행할 때 사용할 테스트 실행기를 지정하는 데에 사용됨
나는 @RunWith(MockitoJUnitRunner.class)를 사용했지만
상황에 따라 () 괄호 안에 다른 실행기가 들어갈 수 있음

@Before

Junit 프레임워크에서 사용되는 어노테이션
테스트 메서드가 실행되기 전에 실행할 메서드를 지정할 때 사용한다.

이 메서드는 테스트 메서드가 실행되기 전에 반드시 1번 실행된다.
테스트 전 초기화 작업으르 위해 사용

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

@Mock
SomethingService somthingService;

@Before
public void setup() {
	// 위에 선언한 mock 객체(somthingService)로 mock 객체 초기화
    MockitoAnnotaions.initMocks(this); 
}

Assert(새로운거 배울때마다 추가예정)

  • Assert.assertEquals(x,y)
    : 객체 x(예상값)와 y(실제값)가 일치하면 테스트가 성공한다
profile
minj-j`s Development diary!

0개의 댓글