GoogleMock : 특정 인수로 정확히 하나의 호출을 기대하고 실패에 대한 진단을 보는 방법은 무엇입니까?

헬릭스

아마 기교적인 질문 일 수도 있습니다.

EXPECT_CALL(mock, handleMessage(_)).Times(0);                           // expectation #1
EXPECT_CALL(mock, handleMessage(Pointee(IsLike(aSpecificMessage))));    // expectation #2

... 메서드 handleMessage가 한 번 호출되지만 다른 인수 (아님 aSpecificMessage)를 사용하면 실패는 다음과 같습니다.

Mock function called more times than expected - returning default value.
    Function call: handleMessage(0x8b5378)
          Returns: false
         Expected: to be never called
           Actual: called once - over-saturated and active

Google Mock은 인수가 예상 # 2의 술어와 일치하지 않는 이유에 대한 진단을 인쇄하지 않습니다. 이것은 예상 # 1이 가장 먼저 실패 (?)하기 때문일 것입니다.

기대 # 1을 생략하면 실패는 다음과 같이 장황합니다.

Google Mock tried the following 1 expectation, but it didn't match:

../../test/Test.cpp:143: EXPECT_CALL(mock, handleMessage(Pointee(IsLike(aSpecificMessage))))...
  Expected arg #0: points to a value that <....>
           Actual: 0xfeaf18, which points to <.....>

사용자 지정 Matcher를 사용하고 있는데 IsLike매우 명시적인 불일치 원인을 생성하는 문제를 겪었습니다. 인쇄를 원합니다. 나는 또한 "기본"섹션에 들어가고 기본적으로 나머지 테스트 동안 모의에 대한 호출을 원하지 않기 때문에 기대 # 1을 포기하고 싶지 않습니다.

롭 케네디

템플릿 수정자를 사용해야 하는StrictMock 것 같습니다 . 이 간단한 클래스와 모의를 사용합시다.

struct Foo
{
    virtual void function(int) {
    }
};

struct MockFoo: public Foo
{
    MOCK_METHOD1(function, void(int x));
};

해당 방법을 실행하는 기본 테스트부터 시작하겠습니다.

TEST(MockTest, basic_one_expectation)
{
    MockFoo foo;
    EXPECT_CALL(foo, function(4));
    Foo& foo1(foo);
    foo1.function(3);
}

산출:

[실행] MockTest.basic_one_expectation
알 수없는 파일 : 실패

예기치 않은 모의 함수 호출-직접 반환.
    함수 호출 : function (3)
Google Mock은 다음 1 가지 예상을 시도했지만 일치하지 않았습니다.

mock-test.cpp : 298 : EXPECT_CALL (foo, function (4)) ...
  예상 인수 # 0 : 4와 같음
           실제 : 3
         예상 : 한 번 호출
           실제 : 전화 안함-만족스럽지 않고 활동적임
mock-test.cpp : 298 : 실패
실제 함수 호출 수가 EXPECT_CALL (foo, function (4)) ...과 일치하지 않습니다.
         예상 : 한 번 호출
           실제 : 전화 안함-만족스럽지 않고 활동적임
[실패] MockTest.basic_one_expectation (1ms)

이것은 이미 고려한 대안 중 하나이지만 함수가 호출되는지 여부에 대한 특별한 기대가없는 다른 테스트가 있고 함수가 호출되면 해당 테스트가 실패하기를 원하기 때문에 원하지 않습니다. 어쨌든. 다시 말씀 드리지만, 이러한 테스트를 시도했을 때 어떤 일이 발생했는지 보겠습니다.

TEST(MockTest, basic_no_expectation)
{
    MockFoo foo;
    Foo& foo1(foo);
    foo1.function(3);
}

산출:

[실행] MockTest.basic_no_expectation

GMOCK 경고 :
흥미롭지 않은 모의 함수 호출-직접 반환.
    함수 호출 : function (3)
스택 추적 :
[OK] MockTest.basic_no_expectation (1ms)

경고를 받았지만 테스트는 여전히 통과합니다. 그것은 당신에게 좋지 않습니다. 어떤 효과 StrictMock있는지 살펴 보겠습니다 .

TEST(MockTest, strict_no_expectation)
{
    ::testing::StrictMock<MockFoo> foo;
    Foo& foo1(foo);
    foo1.function(3);
}

산출:

[실행] MockTest.strict_no_expectation
알 수없는 파일 : 실패
흥미롭지 않은 모의 함수 호출-직접 반환.
    함수 호출 : function (3)
[실패] MockTest.strict_no_expectation (0ms)

함수가 호출되는 것을 원하지 않는다고 명시 적으로 말할 필요는 없지만 함수가 호출되면 테스트가 올바르게 실패합니다. 정확히 당신이 원했던 것.

마지막으로 함수의 인수에 대한 명시적인 기대 StrictMock 있는 경우 어떻게되는지 살펴 보겠습니다 .

TEST(MockTest, strict_one_expectation)
{
    ::testing::StrictMock<MockFoo> foo;
    EXPECT_CALL(foo, function(4));
    Foo& foo1(foo);
    foo1.function(3);
}

산출:

[실행] MockTest.strict_one_expectation
알 수없는 파일 : 실패

예기치 않은 모의 함수 호출-직접 반환.
    함수 호출 : function (3)
Google Mock은 다음 1 가지 예상을 시도했지만 일치하지 않았습니다.

mock-test.cpp : 307 : EXPECT_CALL (foo, function (4)) ...
  예상 인수 # 0 : 4와 같음
           실제 : 3
         예상 : 한 번 호출
           실제 : 전화 안함-만족스럽지 않고 활동적임
mock-test.cpp : 307 : 실패
실제 함수 호출 수가 EXPECT_CALL (foo, function (4)) ...과 일치하지 않습니다.
         예상 : 한 번 호출
           실제 : 전화 안함-만족스럽지 않고 활동적임
[실패] MockTest.strict_one_expectation (0ms)

진단은 basic_one_expectation위에 표시된 원래 테스트 와 마찬가지로 인수가 일치하지 않는 이유를 보여줍니다 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관