Rhino Mocks의 목과 스텁의 차이점은 무엇입니까?


149

나는 이것으로 충분히 놀지 못했고 보통 모의를 사용하지만, Rhino Mocks 에서이 둘과 언제 둘을 사용할 것인지 궁금합니다.

최신 정보:

또한 Ayende의 말 에서 내 질문에 대한 답변을 찾았습니다 .

스텁과 모의 차이점

이 기사에서 다음 용어의 실제 정의를 얻을 수 있습니다. Mocks Are n't Stubs . Rhino Mocks의 관점과의 차이점에 중점을두고 싶습니다.

모의는 우리가 기대를 할 수 있고 예상되는 행동이 실제로 발생했는지 확인할 수있는 대상입니다. 스텁은 테스트중인 코드에 전달하기 위해 사용하는 오브젝트입니다. 기대치를 설정하면 특정 방식으로 작동하지만 이러한 기대는 검증되지 않습니다. 스텁의 속성은 자동으로 일반 속성처럼 동작하므로 예상 값을 설정할 수 없습니다.

테스트중인 코드의 동작을 확인하려면 적절한 기대 값을 가진 모의를 사용하여 확인하십시오. 특정 방식으로 작동해야하지만이 테스트의 초점이 아닌 값을 전달하려는 경우 스텁을 사용합니다.

중요 : 스텁은 테스트 실패를 유발하지 않습니다.


답변:


148

... 간단히 Mock과 Stub 객체 사이에 차이점이 있으며 RhinoMocks는 우리가 목적을 더 잘 나타내는 테스트를 작성할 수 있다는 것을 인식합니다.

모의 객체는 기대치를 정의하는 데 사용됩니다. Mocks는 그러한 기대를 기록하고 확인합니다.

반면에 스텁은 다른 목적을 가지고 있습니다. 기대치를 기록하거나 확인하지 않고 테스트 시나리오를 활용하기 위해“가짜”객체의 동작, 상태를“대체”할 수있게합니다.


이 질문에 대해 허용 된 답변과 동일한 메시지 인 martinfowler.com/articles/mocksArentStubs.html을 보여주는 또 다른 유용한 게시물을 찾았습니다 .
singh1469

20

일반적으로 말하기, Unit 테스트는 함수와 메소드를 호출 한 다음 예상 된 동작이 발생했는지 확인합니다. 이러한 기능과 방법에는 매개 변수가 필요할 수 있습니다. 우리는 이러한 매개 변수를 만족시키기 위해 스텁과 모의를 사용합니다. 때로는 전역 객체를 조롱 할 수도 있습니다.

스텁

스텁은 테스트에서 함수 호출을 수행하기위한 매개 변수로 사용할 수있는 작은 가짜 오브젝트입니다. 이를 통해 테스트중인 함수의 동작을 확인할 수 있습니다. 스텁에는 구현이 없기 때문에 부작용을 확인할 수 없습니다.

목신

Mock은 구현 된 스텁입니다. 테스트중인 함수가 모의 객체와 상호 작용하면 모의가 예상대로 상호 작용했는지 확인할 수 있습니다.

예를 들어, 모의 User 객체가 있고 session.login 메소드가 작동하는지 확인하고 user.lastLoggedIn이 설정되어 있는지 확인할 수 있습니다. 이 방법을 구현하는 모의 사용자를 만들 수 있습니다. session.login을 호출하면 user.lastLoggedIn에 예상 한 상태가 있다고 주장 할 수 있습니다.

요약하자면

모의는 구현 된 스텁으로 부작용을 테스트 할 수 있습니다.

이 차이가 여전히 중요합니까?

직유와 은유의 차이와는 달리, 스텁과 목의 차이는 미묘하고 역사적이며, 아마도 주요 기술 차이보다는 테스트 세계의 다른 공동체와 철학과 더 관련이 있습니다.

그것들은 테스트에 대한 약간 다른 접근법을 나타냅니다. 모의는 그루터기처럼 쓸 수 있습니다. 스텁은 일반적으로 모의로 확장 될 수 있습니다.

어느 것을 사용해야합니까?

스텁 작성을 시작한 다음 나중에 일부 오브젝트에 대한 모의 오브젝트를 작성해야 할 수도 있습니다. 갈 때 모든 것을 조롱하거나 필요할 때 조롱하고 싶을 수도 있습니다.


7

Mock과 Stub의 차이점 : Stub을 사용하면 단위 테스트의 입력을 수정합니다. 따라서 단위 테스트는 일부 메소드의 구현을 다시 작성하여 스텁과 스텁에 대해 주장하지 않습니다. 가짜 객체의 동작을 수정하십시오. Mock을 사용하면 단위 테스트의 출력을 수정하므로 단위 테스트는 모의 객체의 내부 상호 작용을 확인하여 Mocking 객체를 예상합니다.


테스트에서 모의 ​​출력을 "확인"해야한다고 말하는 것 같습니다. 그것이 당신이 말하는 것이라면, 당신은 틀립니다. 모의는 테스트되지 않아야한다. 다른 코드를 테스트 할 수 있습니다 . 아니면 마지막 문장이 다른 의미입니까?
Andrew Barber

1
앤드류, 내가 Mock으로 작성 했으므로 테스트 결과를 수정하여 테스트하지 않을 것입니다. 그렇지 않으면 Mock을 사용하여 상호 작용 (예상 동작 ... ;-)을 확인할 수 있습니다.
Hassan Boutougha

1
더 이해가 되네요. 설명 주셔서 감사합니다!
Andrew Barber

스텁에서 어설 션을 작성하지 않는 이유 많은 어설 션 라이브러리에서 여전히 매개 변수 should have been called with를 어설 하는 방법이 존재하는 이유 stub
hellboy

5

Moq 프레임 워크의 경우-설정 방법은 STUB이며, 확인 방법은 Mock입니다.


0

내가 알았던 한 가지는 MockRepository.GenerateMock을 사용할 때 해당 메소드를 호출하기 위해 특정 메소드 호출에 대한 기대치를 명시 적으로 설정해야한다는 것입니다. 스텁을 사용하면 가상 인 한 모든 메소드를 자동으로 가로채는 것 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.