NSubstitute
🧩 정의
NSubstitute란?
NSubstitute는 .NET 환경에서 Mock 객체를 쉽게 만들고, 호출 여부와 반환값을 검증할 수 있게 해주는 테스트 라이브러리이다.
- 인터페이스나 가상 메서드의 동작을 흉내낼 수 있다.
- 테스트에서 외부 의존성을 분리할 때 유용하다.
Received()같은 문법으로 호출 검증을 할 수 있다.
⚙️ 환경구성
NSubstitute NuGet 설치

커맨드 창을 열어 nuget.exe 파일 경로로 이동
커맨드라인 입력하여 실행
nuget.exe Install NSubstitute.Analyzers.CSharp -Version 1.0.15

DLL 파일을 저장하고자 하는 경로에 Import
- 이때
Castle.Core.dll파일도 같은 경로에 import 해야 한다.


{: width=”50%” height=”50%”}
Unity Play TestRunner를 생성한 후 Play Tests 파일에 Assembly References를 등록

Player TestRunner 생성 방법은 => TestRunner 참고
🛠 핵심 사용법
Substitute.For<T>()로 Mock 객체를 만든다.- 반환값이 있는 메서드는
Returns()로 결과를 지정한다. - 호출 여부는
Received()로 검증한다. - 호출하지 않았는지는
DidNotReceive()로 확인한다.
🧪 테스트
소스코드
- 간단한 테스트를 통해 몇가지 함수를 확인
//Mock 생성을 위한 인터페이스 정의
public interface ITestObj
{
public int PropertyValue { get; set; }
public void DoNothing(int input);
public int AddOne(int input);
}
// 단위테스트
public class TestTestObj
{
ITestObj testObj;
[SetUp]
public void SetUp()
{
testObj = Substitute.For<ITestObj>(); // Mock Instance 생성
testObj.AddOne(1).Returns(2); // 반환값이 있는 함수의 리턴값 정의
testObj.PropertyValue.Returns(2); // Property 반환값 정의
}
[UnityTest]
public IEnumerator TestTestObjAddOne()
{
Debug.Log($"AddOne(1) : {testObj.AddOne(1)}");
Assert.AreEqual(2, testObj.AddOne(1));
testObj.DoNothing(3);
// 반환값이 없는 함수가 호출되었는지에 대한 검증
testObj.Received().DoNothing(3);
// 반환값이 없는 함수가 호출되지 않았는지에 대한 검증
//testObj.DidNotReceive().AddOne(2);
yield return null;
}
}
결과

⚠️ 주의사항
- Mock 대상은 보통 인터페이스나 virtual 메서드가 적합하다.
- 너무 많은 동작을 한 테스트에서 검증하면 읽기 어려워질 수 있다.
- 외부 의존성만 흉내 내고, 테스트 대상 로직 자체는 실제로 검증해야 한다.
Castle.Core.dll의존성이 함께 필요할 수 있다.
📌 정리
- NSubstitute는 .NET 테스트에서 Mock 객체를 쉽게 만드는 라이브러리다.
Returns(),Received(),DidNotReceive()가 핵심 문법이다.- Unity Play Mode 테스트에서도 외부 의존성을 분리할 때 유용하다.
댓글남기기