먼저 아래의 간단한 코드로 시작합니다.
[TestMethod] public void GenerateMock_Vs_GenerateStub() { // 1. GenerateStub var stubRepository = MockRepository.GenerateStub<IRepository>(); stubRepository.Property = 1; Assert.AreEqual(stubRepository.Property, 1); // 2. GenerateMock var mockRepository = MockRepository.GenerateMock<IRepository>(); mockRepository.Property = 1; Assert.AreEqual(mockRepository.Property, 0); mockRepository.Stub(t => t.Property).Return(1); Assert.AreEqual(mockRepository.Property, 1); } |
[TestMethod] public void The_Difference_Between_Stubs_And_Mocks() { var repository = MockRepository.GenerateMock<IRepository>(); // MockRepository.GenerateStub<IRepository>(); var user = new User { Name = "Old User" }; repository.Stub(t => t.GetUser("Old User")).Return(user); repository.Expect(t => t.Save(user)); var controller = new LoginController(repository); controller.ChangeUserName("Old User"); repository.VerifyAllExpectations(); } |
그러면 검증 대상이 된 LoginController는 어떻게 구현이 되어 있는지 살펴보겠습니다.
public class LoginController { IRepository repository; public LoginController(IRepository repository) { this.repository = repository; } public void ChangeUserName(string userName) { var user = repository.GetUser(userName); user.Name = "New User"; repository.Save(user); } } |
기본편에서 살펴볼 마지막은 Event와 관련된 코드입니다.
[TestMethod] public void Event_Registration() { var view = MockRepository.GenerateMock<Form>(); var presenter = new Presenter(view); view.Raise(t => t.Load += null, this, EventArgs.Empty); Assert.IsTrue(presenter.OnLoadCalled); } public class Presenter { public bool OnLoadCalled { get; set; } private Form loginForm; public Presenter(Form loginForm) { this.loginForm = loginForm; this.loginForm.Load += new EventHandler(loginForm_Load); } void loginForm_Load(object sender, EventArgs e) { OnLoadCalled = true; } } |
본 글에서는 Rhino Mock를 사용하는 기본적인 방법을 살펴보고 해당 방법을 통하여 Mocking Framework가 필요한 이유와 실질적으로 어떠한 상황에서 사용하는지를 간단히 살펴보았습니다.(물론 저의 생각.. ㅋㅋ)
다음 편을 쓸지는 장담할 수 없지만 DB 대신의 저장소의 역할을 하는 예제와 UI와 관련된 테스트 코드 작성 등등 좀 더 실질적으로 사용할 수 방법을 공유하도록 하겠습니다.
참고 사이트
http://ayende.com/wiki/Rhino+Mocks+3.5.ashx
http://builds.hibernatingrhinos.com/builds/Rhino-Mocks