[c#] C# 유닛 테스트에서 테스트 더블

테스트 더블은 여러가지 형태로 나뉩니다. 모의 객체(Mock), 스텁(Stub), 가짜(Fake), 스파이(Spy) 등이 있는데, 각각의 역할과 사용 방법을 살펴보겠습니다.

모의 객체 (Mock)

모의 객체는 특정 동작을 시뮬레이션하거나 객체 간의 상호작용을 검증합니다. 일반적으로 특정 메서드가 호출되었는지, 얼마나 많이 호출되었는지, 특정 매개변수로 호출되었는지를 확인하는 데 사용됩니다.

// 모의 객체 생성
var mockService = new Mock<IService>();

// 모의 객체 동작 설정
mockService.Setup(s => s.MethodToTest(It.IsAny<string>())).Returns(true);

// 모의 객체 사용
var result = mockService.Object.MethodToTest("parameter");

// 모의 객체 검증
mockService.Verify(s => s.MethodToTest("parameter"), Times.Once);

스텁 (Stub)

스텁은 특정 메서드 호출에 대한 결과를 가짜로 제공합니다. 특정 조건에 따라 값을 반환하거나 예외를 발생시키는 등의 역할을 합니다.

// 스텁 생성
var stubService = new StubService();

// 스텁 동작 설정
stubService.Setup(s => s.MethodToTest(It.IsAny<string>())).Returns(true);

// 테스트 대상에 스텁 사용
var result = stubService.MethodToTest("parameter");

가짜 (Fake)

가짜는 실제 객체 대신 사용되는 객체로, 실제 객체의 간소화된 버전입니다. 예를 들어, 실제 데이터베이스 대신 메모리에 데이터를 저장하거나 파일 대신 메모리에 데이터를 기록하는 등의 방식으로 사용됩니다.

// 가짜 생성
var fakeRepository = new FakeRepository();

// 가짜 동작 설정
fakeRepository.Add(new Entity { Id = 1, Name = "Example" });

// 테스트 대상에 가짜 사용
var result = fakeRepository.GetById(1);

스파이 (Spy)

스파이는 호출된 메서드의 호출 여부, 횟수, 매개변수 등을 기록하고 검증하는 역할을 합니다.

// 스파이 생성
var spyService = new SpyService();

// 테스트 대상에 스파이 사용
var result = spyService.MethodToTest("parameter");

// 스파이 검증
Assert.True(spyService.WasMethodToTestCalled);

테스트 더블을 잘 활용하면 의존성을 최소화하고 유닛 테스트의 효과를 극대화할 수 있습니다. 유닛 테스트에서 적절한 테스트 더블을 선택하고 활용하여 코드의 신뢰성을 높이고 버그를 예방하는 데 도움이 됩니다.

본 내용은 Microsoft 공식 문서를 참고하여 작성되었습니다.