오늘의하루

[Test Code] Mockito를 활용한 랜덤 값 포함 함수 유닛 테스트 본문

JAVA

[Test Code] Mockito를 활용한 랜덤 값 포함 함수 유닛 테스트

오늘의하루_master 2024. 5. 23. 14:54

이 글에서는 Mockito를 활용하여 Java 애플리케이션에서 랜덤 값을 포함하는 함수를 어떻게 효과적으로 테스트할 수 있는지에 대해 알아보겠습니다.

Mockito

Mockito는 자바에서 Mock 객체를 생성하고 관리할 수 있는 강력한 도구이며, 특히 랜덤 값과 같이 예측하기 어려운 요소가 포함된 함수를 테스트할 때 사용할 수 있습니다.

  • Mock 객체란 실제 객체를 대신하는 가짜 객체를 말합니다.
  • Mock 객체는 외부 의존성이 많은 코드나 복잡한 비즈니스 로직을 가진 코드를 테스트하는 데 매우 유용합니다.

간단한 예제:

import java.util.Random;
import lombok.AllArgsConstructor;

@AllArgsConstructor
public class Game {

	private Random random;
	
	public int AttackPower(int hp) {
		int ranNum = random.nextInt(10);
		return hp * ranNum;
	}
}

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.Random;
import org.junit.jupiter.api.Test;

public class GameTest {

	@Test
	public void testAttackPower() {
		// Given : 
		// Random 클래스를 모킹합니다.
		Random mockRandom = mock(Random.class);
		// 모킹된 Random 클래스는 항상 5를 반환하도록 설정합니다.
		when(mockRandom.nextInt(10)).thenReturn(5); 
		// 모킹된 Random 객체를 사용하여 Game 인스턴스를 생성합니다.
		Game game = new Game(mockRandom);
        
		// When :
		// AttackPower 메소드를 호출합니다.
		int power = game.AttackPower(10);
		
		// Then :
		// 예상되는 공격력을 검증합니다.
		assertThat(power).isEqualTo(50);
	}

}

위 예제에서는 Game 클래스의 AttackPower 메서드를 테스트하는 방법으로 Mockito를 사용하여 Random 클래스를 Mock객체로 만들고, 특정한 값을 반환하도록 설정하여 함수의 예상 출력을 검증합니다.

테스트 코드 작성 순서

  1. Given : 테스트를 준비하는 단계
    • Random 클래스를 Mock 객체로 만들었습니다.
    • 랜덤한 숫자를 통제하기 위해 특정 값을 반환하도록 만들었습니다.
    • 이러한 Mock 객체를 사용해서 Game 인스턴스를 생성합니다.
  2. When : 실제로 테스트하고자 하는 동작을 수행하는 단계
    • Game 인스턴스의 AttackPower() 메서드를 호출하여 실제 결과값을 얻습니다
  3. Then : 기대하는 결과를 검증하는 단계
    • assertThat()을 사용하여 예상되는 공격력과 실제 메서드 호출 결과를 비교하여 검증합니다.
      • assertThat(실제값).isEqualTo(기대값);

Mockito를 사용하고 Mock 객체를 활용하여 알 수 없는 랜덤 값을 통제하여 테스트 코드를 작성하였습니다.

Comments