mock과 stub의 차이점은 무엇입니까?
Martin Fowler의 Mocks는 스텁을 포함 하여 테스트에서 조롱과 스터 빙에 대한 다양한 가이드를 읽었 지만 여전히 차이점을 이해하지 못합니다.
그루터기
가장 큰 차이점은 미리 정해진 행동으로 이미 스텁이라는 것입니다. 따라서 테스트 목적으로 속이는 더 (추상 클래스 또는 인터페이스)를 구현하는 클래스가 처리하는 메서드는 응답으로 스텁 아웃됩니다. 당신은 이미 당신의 테스트 밖에서 구축하는 스텁 코드를 작성 것입니다.
모조품
모의는 테스트의 일부로 기대에 맞게 설정해야하는 것입니다. 모의는 미리 정해진 방식으로 설정되지 않은 테스트에서 수행하는 코드가 있습니다. 어떤 방식으로 으로든 모의는 기대치를 설정하는 코드가 어떤 작업을 수행하기 전에 실행해야하기 때문에 가동에 결정됩니다.
목과 스텁의 차이점
모의 테스트는 작성된으로 일반적 initialize -> set expectations -> exercise -> verify
으로 테스트 패턴을 따릅니다 . 미리 스텁은 initialize -> exercise -> verify
.
목과 스텁의 유사성
둘 다의 목적은 클래스 또는 함수의 모든 테스트를 제거하여 테스트가 증명하려는 내용에 더 집중되고 간단하게하는 것입니다.
머리말
실제가 아닌 객체에 대한 몇 가지 정의가 있습니다. 일반적인 용어는 test double 입니다. 이 용어는 dummy , fake , stub , mock을 포함 합니다.
참고
Martin Fowler의 기사 에 따르면 :
- 더미 오브젝트는 전달됩니다. 일반적으로 매개 변수 목록을 채우는 데 사용됩니다.
- 가짜 object-는 실제로 작동하는 구현을 가지고 있지만 일반적으로 프로덕션에 적합하지 않게 만드는 지름길을 사용합니다 (인 메모리 데이터베이스가 좋은 예입니다).
- 스텁 은 테스트 방송에 대해 미리 준비된 답변을 제공하며, 일반적으로 테스트를 위해 프로그래밍 된 내용 이외의 항목에는 전혀 응답하지 않습니다. 스텁은 또한 '보낸'이메일을 기억하는 이메일 게이트웨이 스텁 또는 '보낸 메시지 수'와 같은 통화에 대한 정보를 기록 할 수 있습니다.
- 모의 는 우리가 여기서 이야기하고있는 것입니다 : 그들이받을 예상되는 호출의 사양을 형성하는 기대치로 미리 프로그래밍 된 것입니다.
스타일
모의 대 스텁 = 행동 테스트 대 상태 테스트
원리
테스트 당 하나만 테스트 원칙에 따라 하나의 테스트에 여러 개의 스텁이있을 수 있습니다.
라이프 사이클
스텁을 장기간 테스트 수명주기 :
- 설정-테스트중인 및 해당하는 스텁 공동을 개체 준비합니다.
- 연습 기능을 테스트합니다.
- 상태 확인-어설 션을 사용하여 개체의 상태를 확인합니다.
- Teardown- 리소스를 정리합니다.
목을 장기간 테스트 수명주기 :
- 설정 데이터 테스트중인 개체를 준비합니다.
- 설정 기대 - 기본적으로 사용중인 모의에서 기대 개체를 준비합니다.
- 연습 기능을 테스트합니다.
- 기대치 확인 -모의에서 올바른 메소드가 호출되었는지 확인합니다.
- 상태 확인-어설 션을 사용하여 개체의 상태를 확인합니다.
- Teardown- 리소스를 정리합니다.
요약
모의 테스트와 스텁 테스트 모두 다음 질문에 대한 답을 제공합니다 . 결과는 무엇입니까?
모의 실험도 관심이 있습니다 : 결과가 어떻게 졌는가?
스텁은 가짜 가짜 개체입니다. 테스트가 원활하게 실행 확인합니다.
mock은 더 똑똑한 스텁입니다. 테스트가 통과하는지 확인합니다.
여기에 실제 샘플과 함께에 대한 설명이 있습니다.
더미 -
API
.예 : 테스트에 영향 을 주지 않는 생성자에 많은 필수 매개 변수가 필요한 클래스의 메소드를 테스트하는 경우 클래스 의 새 인스턴스를 만들 목적으로 더미 개체를 만들 수 있습니다.
가짜 - 일부 외부 인프라에 종속 될 수있는 클래스의 테스트 구현을 만듭니다 . (테스트가 단위 실제로 외부 인프라와 상호 작용 하지 않는 것이 좋습니다 .)
예 :에 액세스하기 데이터베이스위한 가짜 구현을 만들고
in-memory
컬렉션 으로 바꿉니다.Stub- 라고도하는 하드 코딩 된 값을 반환하는 메서드를 재정의합니다
state-based
.예 : 테스트 클래스는
Calculate()
완료 하는 데 5 분이 절차 에 따라 데 있습니다. 5 분을 기다리지 않고 실제 구현을 하드 코딩 된 값을 반환하는 스텁으로 바꿀 수 있습니다. 시간의 일부만 소요됩니다.모의 -매우 유사
Stub
하지만interaction-based
상태 기반이 아닙니다. 즉, 일부에서Mock
값을 반환 할 기대하지 않고 특정 메서드 호출 순서가 만들어 졌다고 가정 함 을 의미합니다 .예 : 사용자 등록 클래스를 테스트하고 있습니다. 호출 후를 호출
Save
해야합니다SendConfirmationEmail
.
Stubs
그리고 Mocks
실제로는 하위 유형이며 Mock
둘 다 실제 구현을 테스트 구현과 교체하지만 다른 구체적인 이유가 있습니다.
에서 codeschool.com의 과정, 레일 테스트는 좀비를 위해 , 그들은 용어의 정의를 제공합니다 :
그루터기
메서드를 지정된 결과를 반환하는 코드로 대체합니다.
모조품
메서드가 호출 주장이있는 스텁입니다.
따라서 Sean Copenhaver가 그의 답변에서 설명했듯이 차이점은 모의가 기대치를 설정한다는 것입니다 (즉, 호출 여부 또는 방법에 대한 주장).
스텁은 테스트에 실패하지 않습니다.
이 질문에 대한 가장 간단하고 명확한 저서 제공은 Roy Osherove 의 저서 The art of Unit Testing (85 페이지)에서 한 것입니다.
스텁을 다루고 있음을 알리는 가장 쉬운 방법은 스텁이 테스트에 실패 할 수 없음을 확인하는 것입니다. 테스트에서 사용하는 어설 션은 항상 테스트중인 클래스에 대한 것입니다.
반면에 테스트는 모의 객체를 사용하여 테스트가 실패했는지 여부를 확인합니다. [...]
다시 말하지만, 모의 객체는 테스트가 실패했는지 여부를 확인합니다.
주장하는 가짜 가짜를 모의로 사용하고 있음을 의미하며 가짜를 사용하여 주장없이 테스트를 실행하는 경우 가짜를 스텁으로 사용하는 것입니다.
위의 모든 설명을 요약 해 보겠습니다.
- Stub : 테스트를 사용하는 더미 코드이지만 어떤 일이 발생하는지는 신경 쓰지입니다.
- Mock : 테스트의 일부로 호출되는 VERIFY 코드의 더미입니다.
- 스파이 : 실제 코드에 대한 일부 호출을 가로채는 더미 코드 조각으로 원본 전체를 충족하지 호출을 확인할 수 있습니다.
Mock은 특정 메소드가 호출 확인하는 동작을 테스트하는 것입니다. 스텁은 특정 개체의 테스트 가능한 버전 (그 자체)입니다.
애플 방식이란 무엇입니까?
당신과 비교하면 :
스텁 은 메서드가 올바른 값을 반환하는지 확인하는 것입니다.
모의 은 실제로 메서드에 들어가서 올바른 값을 반환하기 전에 내부의 모든 것이 올바른지 확인 하는 것과 같습니다 .
그들 사이의 가장 중요한 차이점은 귀하의 고객이라고 생각합니다.
WHY stub vs. WHY mock 에서 설명해 보겠습니다.
내 맥 트위터 클라이언트의 공개 타임 라인 컨트롤러에 대한 테스트 코드를 작성 가정 해 보입니다.
다음은 테스트 샘플 코드입니다.
twitter_api.stub(:public_timeline).and_return(public_timeline_array)
client_ui.should_receive(:insert_timeline_above).with(public_timeline_array)
controller.refresh_public_timeline
- STUB : twitter API에 대한 네트워크 연결이 매우 느려서 테스트 속도가 느려입니다. HTTP 트위터 API를 시뮬레이션하는 것을 알고 있기 때문에 테스트가 매우 빠르게 실행되고 오프라인 상태에서 테스트를 할 수 있습니다.
- MOCK : 아직 UI 메서드를 갑자기 발생하지 않는 UI 개체에 대해 어떤 방법을 작성 해야하는지 잘 모르겠습니다. 내 컨트롤러가 테스트 코드를 작성하여 내 ui와 어떻게 협업하는지 알고 싶습니다.
mock을 작성하여 스텁은 수업에서 동작 만 시뮬레이션하는 동안 기대할 때 확인하여 협업 관계를 발견합니다.
mock에 대해 더 많이 알고있는 것이 기사를 읽는 것이 좋습니다. http://jmock.org/oopsla2004.pdf
매우 명확하고 실용적입니다.
Stub : 위조 될 클래스 / 객체의 메소드를 구현하고 항상 원하는 반환하는 클래스 또는 객체입니다.
자바 펼쳐의 예 :
var Stub = {
method_a: function(param_a, param_b){
return 'This is an static result';
}
}
Mock : 스텁과 동일하지만 메소드가 호출 될 때 "확인"하는 방법을 추가하여 일부 구현이 메소드를 호출하는지 확인할 수 있습니다.
@mLevan이 말했듯이 사용자 클래스를 테스트하고 상상해 등록합니다. 저장을 호출 한 후 SendConfirmationEmail을 호출해야합니다.
아주 멍청한 코드 예 :
var Mock = {
calls: {
method_a: 0
}
method_a: function(param_a, param_b){
this.method_a++;
console.log('Mock.method_a its been called!');
}
}
멘탈 모델을 사용하면 모든 설명과 기사보다는 사실을 이해하는데 도움이됩니다.
아이가 탁자 위에 유리판을 가지고 있고 놀기 시작 이론 상상해. 이제 당신은 그것이 깨질 까봐 두려워합니다. 그래서 당신은 그에게 대신 플라스틱 접시를 제공합니다. 그것은 모의 (동일한 동작, 동일한 인터페이스, "더 부드러운"구현)입니다.
이제 플라스틱 대체품이 계속해서 "계속해서 플레이하면 깨질 것입니다!"라고 설명합니다. 그것은 스텁 이며 미리 정의 된 상태를 제공했습니다.
더미는 심지어 사용하지 않은 것입니다 ... 그리고 스파이는 이미 일한 사용되는 것과 동일한 설명을 제공하는 동일한 수 있습니다.
이 슬라이드는 주요 차이점을 매우 잘 설명합니다.
* University of Washington의 CSE 403 강의 16 ( "Marty Stepp"에서 만든 슬라이드)
나는 Roy Osherove [비디오 링크]가 내놓은 설명을 좋아합니다 .
생성 된 모든 클래스 또는 객체는 가짜입니다. 대한 호출을 확인하면 모의입니다. 구별되는 스텁입니다.
- 스텁 대 모크
- 스텁
- 메서드 호출에 대한 구체적인 답변 제공
- 예 : myStubbedService.getValues ()는 테스트중인 코드에 필요한 것들을 반환합니다.
- 격리하기 위해 테스트중인 코드에서 사용
- 시험에 실패 할 수 없다
- 예 : myStubbedService.getValues ()는 스텁 값만 반환합니다.
- 종종 인 방법을 구현
- 메서드 호출에 대한 구체적인 답변 제공
- 모크
- 스텁의 "수퍼 세트"; 특정 메소드가 호출을 주장 할 수 있습니다.
- 예 : myMockedService.getValues ()가 한 번만 호출 확인합니다.
- 테스트중인 코드의 동작을 테스트하는 데 사용
- 테스트에 실패 할 수 있습니다.
- 예 : myMockedService.getValues ()가 한 번 호출 확인합니다. myMockedService.getValues ()가 테스트 된 코드에서 호출되지 않았기 때문에 확인에 실패했습니다.
- 종종 인터페이스를 조롱
- 스텁의 "수퍼 세트"; 특정 메소드가 호출을 주장 할 수 있습니다.
- 스텁
가짜는 실제 개체 같은 사람들 때문에 모두보기, 스텁 또는 모의 중 하나를 설명하는 데 사용되는 수있는 일반적인 용어이다.
가짜가 스텁인지 모의인지에 따라 테스트에서 어떻게 사용하는지가 있습니다. 상호 작용을 확인하는 데 사용되는 경우 (어설 션됨) 모의 객체입니다. 구별되는 스텁입니다.
가짜 는 테스트가 원활하게 실행됩니다. 이는 즉석 테스트의 독자가 소스 코드를 읽을 필요없이 (외부 리소스에 의존 할 필요없이) 가짜 개체의 동작이 무엇인지 수 있음을 의미합니다.
은 무슨 뜻인가요?
예를 들어 아래 코드에서 :
public void Analyze(string filename)
{
if(filename.Length<8)
{
try
{
errorService.LogError("long file entered named:" + filename);
}
catch (Exception e)
{
mailService.SendEMail("admin@hotmail.com", "ErrorOnWebService", "someerror");
}
}
}
mailService.SendEMail () 메서드 를 테스트하고 싶습니다. 테스트 메소드에서 예외를 시뮬레이션해야하는 시뮬레이션 결과를 시뮬레이션하기 위해 Fake Stub errorService 클래스를 생성합니다. 그럼 테스트 코드에서 테스트 할 수 있습니다. mailService.SendEMail () 메서드. 보시다시피 다른 External Dependency ErrorService 클래스의 결과를 시뮬레이션해야합니다.
테스트 복식을 보자 :
- Fake : 가짜 구현과 동일하지 않은 구현입니다. 예 : 데이터 액세스 개체 또는 저장소의 메모리 내 구현.
Stub : Stub은 미리 정의 된 데이터를 보유하고 테스트 중에 호출에 응답하는 데 사용하는 개체입니다. 예 : 메서드 호출에 응답하기 위해 데이터베이스에서 일부 데이터를 가져와야하는 개체.
Mocks : Mocks는 수신하는 호출을 등록하는 등록입니다. 테스트 어설 션에서 예상되는 모든 작업이 수행됩니다. 예 : 이메일 전송 서비스를 호출하는 기능. 내용은 자세한 이것을 확인 하십시오 .
jMock 개발자가 주장 논문 Mock Roles, Objects 에서 바로 :
스텁은 미리 준비된 결과를 반환하는 코드의 더미 구현입니다. 모의 객체는 스텁 역할을 객체 객체와 이웃의 상호 작용을 계측하기 위해 션도 포함합니다.
주요 차이점은 다음과 가변적입니다.
- 일반적으로 일반적이지만 모의에 기대치는 더 "영리"할 수 있습니다 (예 : 첫 번째 호출에서 반환하고 두 번째 호출에서 반환하는 등).
- 스텁 은 주로 SUT의 간접 입력 을 설정 하는 데 사용되는 반면 모의 는 SUT의 간접 입력과 간접 출력을 모두 테스트 하는 데 사용할 수 있습니다 .
요약하자면, Fowler의 기사 제목 에서 혼란을 분산 시키려고 노력하면서 모의는 스텁이지만 스텁 일 아니라 .
UncleBob The Little Mocker의 흥미로운 기사를 보았습니다 . 모든 용어를 매우 이해하기 쉬운 방식으로 설명하는 것이 유용합니다. Martin Fowlers는 특히 저와 같은 많은 것을 위해 읽기 어렵습니다.
C # 및 Moq 프레임 워크를 사용하는 모의 대 스텁의 아래 예를 참조하십시오. Moq에는 Stub에 대한 특수 키워드가 없지만 Mock 객체를 사용하여 스텁을 만들 수도 있습니다.
namespace UnitTestProject2
{
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
[TestClass]
public class UnitTest1
{
/// <summary>
/// Test using Mock to Verify that GetNameWithPrefix method calls Repository GetName method "once" when Id is greater than Zero
/// </summary>
[TestMethod]
public void GetNameWithPrefix_IdIsTwelve_GetNameCalledOnce()
{
// Arrange
var mockEntityRepository = new Mock<IEntityRepository>();
mockEntityRepository.Setup(m => m.GetName(It.IsAny<int>()));
var entity = new EntityClass(mockEntityRepository.Object);
// Act
var name = entity.GetNameWithPrefix(12);
// Assert
mockEntityRepository.Verify(m => m.GetName(It.IsAny<int>()), Times.Once);
}
/// <summary>
/// Test using Mock to Verify that GetNameWithPrefix method doesn't call Repository GetName method when Id is Zero
/// </summary>
[TestMethod]
public void GetNameWithPrefix_IdIsZero_GetNameNeverCalled()
{
// Arrange
var mockEntityRepository = new Mock<IEntityRepository>();
mockEntityRepository.Setup(m => m.GetName(It.IsAny<int>()));
var entity = new EntityClass(mockEntityRepository.Object);
// Act
var name = entity.GetNameWithPrefix(0);
// Assert
mockEntityRepository.Verify(m => m.GetName(It.IsAny<int>()), Times.Never);
}
/// <summary>
/// Test using Stub to Verify that GetNameWithPrefix method returns Name with a Prefix
/// </summary>
[TestMethod]
public void GetNameWithPrefix_IdIsTwelve_ReturnsNameWithPrefix()
{
// Arrange
var stubEntityRepository = new Mock<IEntityRepository>();
stubEntityRepository.Setup(m => m.GetName(It.IsAny<int>()))
.Returns("Stub");
const string EXPECTED_NAME_WITH_PREFIX = "Mr. Stub";
var entity = new EntityClass(stubEntityRepository.Object);
// Act
var name = entity.GetNameWithPrefix(12);
// Assert
Assert.AreEqual(EXPECTED_NAME_WITH_PREFIX, name);
}
}
public class EntityClass
{
private IEntityRepository _entityRepository;
public EntityClass(IEntityRepository entityRepository)
{
this._entityRepository = entityRepository;
}
public string Name { get; set; }
public string GetNameWithPrefix(int id)
{
string name = string.Empty;
if (id > 0)
{
name = this._entityRepository.GetName(id);
}
return "Mr. " + name;
}
}
public interface IEntityRepository
{
string GetName(int id);
}
public class EntityRepository:IEntityRepository
{
public string GetName(int id)
{
// Code to connect to DB and get name based on Id
return "NameFromDb";
}
}
}
스텁 및 모의 테스트 관점 :
Stub 은 사용자가 정적 방식으로 수행 한 더미 구현입니다. 즉, 구현 코드를 작성하는 Stub에서 의미합니다. 따라서 서비스 정의 및 동적 조건을 처리 할 수 있으며 일반적으로 모의 프레임 워크를 사용하지 않고 JUnit 프레임 워크에서 수행합니다.
모의 은 더미 구현이지만 Mockito와 같은 비웃음 워크를 사용-frame하여 동적 으로 구현됩니다 . 따라서 조건 및 서비스 정의를 동적 방식으로 처리 할 수 있습니다. 즉, 실행시 코드에서 동적으로 모의를 만들 수 있습니다. 따라서 모의를 사용하여 스텁을 동적으로 구현할 수 있습니다.
Stub 은 테스트를 실행하는 데 도움이됩니다. 어떻게? 테스트 실행에 도움이되는 값을 제공합니다. 이 값 자체는 실제가 실행 테스트를 실행하기 위해 필요한 값을 만들었습니다. 예를 들어 데이터베이스 테이블의 값과 추천 값을 제공하기 위해 HashMap을 만듭니다. 따라서 데이터베이스와 직접 상호 작용하는 대신 Hashmap과 상호 작용합니다.
Mock 은 테스트를 실행하는 가짜 개체입니다. 우리가 주장하는 곳.
Mockito 예
Stub 은 미리 준비된 데이터 만 반환합니다. 스텁은 간단하고 간단합니다. 기본적으로 가능한 가장 간단한 메소드 구현이며 매번 미리 준비된 데이터를 반환합니다. 이를 통해 호출에 대해 반환 된 값을 제어 할 수 있습니다.
모의 객체는 테스트중인 객체가 특정 메서드를 호출했는지 확인하는 방법을 제공합니다.
그리고 Martin Fowler가 그의 에세이 에서 말했듯이
stub
상태 확인을mock
사용 하는 반면 동작 확인 을 사용 하는 데는 차이가 있습니다 .
차이점을 설명하기 위해 내 대답에 능숙한 예제를 사용했습니다.
Stub -Stubbing은 개발 라이프 사이클 초기에 클래스 메소드를 구현하는 데 사용되는 소프트웨어 개발 기술입니다. 구현이 아직 완료되지 않은 상태에서 작동하지 않습니다. 스텁으로 시작합니다. 이는 곧 함수의 정의 만 작성하고 나중에 실제 코드를 두는 것을 의미합니다. 바람직하게는 메소드를 잊지 않고 코드로 계속 생각할 수 디자인 것입니다. 또한 코드의 다른 부분에서 즉시 응답을 사용할 수 있으므로 스텁이 정적 응답을 반환 할 수 있습니다. Stub 전달은 유효한 응답을 제공하지만 어떤 입력을 전달합니다.
class Foo(object):
def bar1(self):
pass
def bar2(self):
#or ...
raise NotImplementedError
def bar3(self):
#or return dummy data
return "Dummy Data"
모의 객체는 모의 테스트 케이스에서 사용이 호출됩니다. 모의 수업은 제어 된 방식으로 실제 객체의 동작을 모방하는 시뮬레이션 된 방식입니다. 일반적으로 다른 개체의 동작을 테스트하기 위해 모의 개체를 만듭니다. Mock을 사용하면 사용할 수있는 내부 테스트에 너무 다루기 힘든 리소스를 시뮬레이션 할 수 있습니다.
mymodule.py :
import os
import os.path
def rm(filename):
if os.path.isfile(filename):
os.remove(filename)
test.py :
from mymodule import rm
import mock
import unittest
class RmTestCase(unittest.TestCase):
@mock.patch('mymodule.os')
def test_rm(self, mock_os):
rm("any path")
# test that rm called os.remove with the right parameters
mock_os.remove.assert_called_with("any path")
if __name__ == '__main__':
unittest.main()
이것은 rm을 실행하고 호출 된 기본 변수를 주장하는 매우 기본적인 예제입니다. 여기에 사용할 수있는 것처럼 함수를 대체 할 수 있고 함께 사용할 수있는 것입니다.
unittest.mock 에 대한 자세한 내용은 python 2.x mock의 참고 사항은 unittest 에 포함되어 있지 않지만 pip (pip install mock)를 통해 다운로드 할 수있는 다운로드 가능한 모듈입니다.
또한 Roy Osherove의 "The Art of Unit Testing"을 읽거나 사용하는 책이 Python 및 Python을 작성하여 작성면 좋을 것입니다. 그런 책을 아는 사람이 있으면 공유하십시오. 건배 :)
스텁은 테스트 목적으로 만들어진 가짜 개체입니다. mock은 예상 호출이 발생 여부를 기록하는 스텁입니다.
스텁은 테스트에서 처리되지 않는 예외를 방지하는 데 사용되는 빈 함수입니다.
function foo(){}
mock은 테스트 중에 OS, 환경 또는 하드웨어를 피하는 데 사용되는 인공 함수입니다.
function foo(bar){ window = this; return window.toString(bar); }
주장 및 상태에서 :
- 모의는 이벤트 또는 상태 변경 전에 주장됩니다.
- 스텁은 어설 션되지 않고 관련되지 않은 유닛의 코드 실행을 방지하기 위해 이벤트 전에 상태를 제공합니다.
- 스파이는 스텁처럼 설정되고 이벤트 또는 상태 변경 후 어설 션됩니다.
- 페이크는 어설 션되지 않은, 상태를 피하기 위해 하드 코딩 된 내용있는 이벤트 실행 실행됩니다.
참고 문헌
많은 유효한 대답이 약속이 양식을 참조 할 가치가 생각합니다 bob 삼촌 : https://8thlight.com/blog/uncle-bob/2014/05/14/TheLittleMocker.html
예제와 함께 최고의 설명!
Stub 은 구성 요소의 인터페이스를 구현하는 반환하지만 호출시 구성 요소가 대신 반환 할 내용을 구성 할 수 있습니다. 스텁을 사용하여 단위 테스트는 단위가 공동으로 다양한 반환 값을 처리 할 수 있습니다. 단위 테스트에서 실제 협력자 대신 스텁을 사용하는 것은 다음과 같이 표현할 수 있습니다.
단위 테스트-> 스텁
단위 테스트-> 단위-> 스텁
단위 테스트는 결과 및 단위 상태에 대해 주장합니다.
단위 테스트는 스텁을 먼저 생성 할 값을 구성합니다. 그런 다음 단위 테스트는 단위를 만들고 그 위에 스텁을 설정합니다. 이제 단위 테스트는 다시 스텁을 호출하는 단위를 호출합니다. 마지막으로 단위 테스트는 단위에 대한 메서드 호출의 결과에 대한 주장을합니다.
Mock 은 스텁과 근거 하지만 Mock 에서 호출 된 메서드를 사용할 수있는 메서드도 있습니다. 따라서 mock을 사용하는 경우 단위가 다양한 반환 값을 처리 할 수 있는지 여부와 단위가 공동 작업을 사용하는지 여부를 테스트 할 수 있습니다. 예를 들어, 데이터가 Statement 또는 PreparedStatement를 사용하여 데이터베이스에서 읽혔는지 여부를 dao 객체에서 반환 된 값으로 볼 수 없습니다. connection.close () 메소드가 호출하기 전에 값을 반환하기 전에 알 수 없습니다. 이것은 모의로 가능합니다. 즉, 모의를 사용하면 유닛이 공동으로 사용하는 완전한 상호 작용을 테스트 할 수 있습니다. 단위에서 사용하는 값을 반환하는 공동 메소드뿐만 아니라. 단위 테스트에서 모의를 사용하는 것은 다음과 같이 표현할 수 있습니다.
단위 테스트-> 모의
단위 테스트-> 단위-> 모의
단위 테스트는 결과 및 단위 상태에 대해 주장합니다.
단위 테스트는 mock에서 호출 된 메서드에 대해 주장합니다.
자세한 내용은 >> 여기
"The Art of Unit Testing"을 발견했는데 다음과 같은 정의를 발견했습니다.
가짜는 실제 개체 같은 사람들 때문에 모두보기, 스텁 또는 모의 중 하나를 설명하는 데 사용할 수있는 고유 용어입니다. 가짜가 스텁인지 모의인지에 따라 테스트에서 어떻게 사용하는지가 있습니다. 상호 작용을 확인하는 데 사용되는 경우 (어설 션됨) 모의 객체 입니다. 않으면 오는가 스텁 입니다.
참고 URL : https://stackoverflow.com/questions/3459287/whats-the-difference-between-a-mock-stub
'ProgramingTip' 카테고리의 다른 글
'이름'또는 'ID'로 HTML 앵커를 소유하고 있습니까? (0) | 2020.09.29 |
---|---|
@property 데코레이터는 어떻게 작동 작동합니까? (0) | 2020.09.28 |
메모장 ++에서 JSON을 다시 포맷하는 방법은 무엇입니까? (0) | 2020.09.28 |
내보내기를 사용하거나 사용하지 않고 변수 정의 (0) | 2020.09.28 |
포트와 소켓의 차이점은 무엇입니까? (0) | 2020.09.28 |