728x90
반응형

 

현재 저는 UnitTest를 이용해서, 제작중인 프로젝트의 테스트를 진행하고 있습니다.

프로젝트를 이용해서 단위테스트를 제작하다가 보면, 테스트 환경에서는 실질적인 DB가 갖춰져 있는 않은 상태가 많이 있습니다.

이럴경우 Data 단의 로직은 항상 실패상황이 발생하게 됩니다.

이럴경우 Mock 라이브러리를 이용하면, 실제 DB에 접속해서 데이터를 가져오는 것 처럼 흉내낼 수 있습니다.

저희도 Mock 라이브러리를 이용해서 UnitTest를 구성중에 있어서 한번 정리해봤습니다.

 

 


Mock 라이브러리

Mock 라이브러리는 .NET 에서 주목 받고 있는 모의 라이브러리 입니다.

Moq는 간단한 API를 가지고 있고, Visual Studio의 Intelisence 기능을 활용할 수 있어 손쉽게 사용이 가능합니다. 

.NET 환경에서 NMock, TypeMock.NET, EasyMock.NET, RhinoMock 등 많은 라이브러리가 존재하지만, 간단한 사용법을 가지고 있어 사용하게 되었습니다. 

 


설치

Moq의 이용은 C # 3.0 (.NET Framework3.5) 이상이 필요합니다.

테스트 도구의 종류는 무엇이든 상관 없지만, 저희는 Visual Studio의 단위 테스트 기능을 사용했습니다. 

패키지는 Nuget 패키지를 이용해서 설치 하였습니다.

검색은 "Moq" 로 해주시면 됩니다. 

 

 

https://github.com/moq/moq4
 

moq/moq4

Repo for managing Moq 4.x . Contribute to moq/moq4 development by creating an account on GitHub.

github.com

 

샘플

public class Stamina
{
    public virtual int Add(int current, int add)
    {
        return current + add;
    }
}

 

public void TestMethod2()
{
    var mock = new Mock<SampleProject.Stamina>();
    mock.Setup( x => x.Add( 1, 2 ) ).Returns( 3 );

    SampleProject.Stamina stamina = mock.Object;
    Assert.AreEqual( 3, stamina.Add( 1, 2 ));
    mock.VerifyAll();
}

 


코드의 설명

우선 Mock을 만들려면 해당 클래스를 지정하여 Mock 인스턴스를 만듭니다.

Mock 클래스의 Setup 메소드를 이용하여 값을 제어 합니다. 

여기에서는 「mock.Setup (x => m.Add (1, 2)). Returns (3) "이라고하여 Add 메서드가 인수 1과 2에서 불려 갔을 경우에 3을 반환하도록 지정 하고 있습니다.

 

모의를 이용하려면 Object 속성을 이용합니다.

이제 Stamina 클래스의 모의를 검색 할 수 있습니다.꺼낸 모의 사용법은 원래 Stamina 클래스와 동일합니다.

 

마지막 VerifyAll 방법은 모의가 제대로 호출되었는지 여부를 확인할 수 있습니다.

 

 


클래스의 모의를 생성 할 때의 주의점

Moq는 모의 메서드를 재정의하는 클래스의 대상 메소드에 virtual 한정자를 둘 필요가 있습니다.

또한 Interface 를 이용해서 진행하는 방식도 있습니다.

 

 

더 고급버전은 다음 블로그에서 설명하겠습니다. 

728x90

+ Recent posts