2017-10-12 1 views
3

gmock이 생소하고 SaveArg를 사용할 때 어떤 일이 일어나는지 이해하고 싶습니다.C++ gmock - SaveArg에 null 포인터 전달시 어떤 일이 발생합니까?

는 여기에 내가 gmock의 다큐에있는 내용은 다음과 같습니다

SaveArg<N>(pointer) : N 번째를 저장 (0 기반) 인수 * 포인터. N 번째의 인수

  1. 메이크업 "포인터"점, 또는

  2. "포인터"가 가리키는대로의 N 번째 인수의 값을 할당 :

    이 무슨 뜻 ?

나는 다음과 같은 상황을 생각하고 : 내 테스트 기능에서 다음

class MockClass : public BaseClass { public: MOCK_METHOD1(somefunc,void(SomeType&)); };

:

SomeType val; //make this live throughout the test 
SomeType* pval = nullptr; 

MockClass mymock; 
EXPECT_CALL(mymock, somefunc(_)).WillOnce(SaveArg<0>(pval)); 

//let's force a call 
mymock.somefunc(val); 

EXPECT_NE(nullptr, pval); 

내 요점은 다음과 같습니다

경우 (1) 사실이라면 무엇이 발생합니까? pval = &val -> 테스트가 진행됩니다.

if (2)가 참이면, 어떤 일이 발생합니까 : *pval = val -> 이것은 pval이 널 포인터 인 경우 세그먼트 화 오류를 일으 킵니다.

위와 비슷한 상황에서 SaveArg에 nullptr을 전달하고 세그먼트 화 오류가 발생하지 않지만 테스트는 통과되지 않습니다.

너희들이 나를 도울 수 있다면 정말 고마워.

감사

답변

1

질문 :

SaveArg (포인터) : N 번째를 저장 (0 기반) 인수 * 포인터. N 번째의 인수에

메이크업 "포인터"점, 또는 "포인터"가 가리키는대로에 N 번째 인수의 값을 할당 :

이 무슨 뜻?

편집 (VladLosev의 수정) 본질적으로 포인터로 가리키는 포인터의 N 번째 인수의 복사 값입니다.

그래서, 당신의 관찰 행동에 관한 : 내가 SaveArg에 nullptr을 통과 세그먼트 오류를 ​​얻을하지 않습니다 위의 것과 유사한 상황이 있지만 테스트 중 를 전달되지

.

이것은 EXPECT_NE의 구현 세부 사항 때문입니다.다음은이 문제에 googletest FAQ에서 짧은 조각이다 :

이 때문에 C++의 일부 특수성에, 그것은 EXPECT_XX()와 ASSERT_XX의 인수로 NULL 사용을 지원하는 일부 비 사소한 템플릿 메타 프로그래밍 트릭이 필요() 매크로. 따라서 우리는 가장 필요한 부분이 인 경우에만 수행합니다 (그렇지 않으면 Google 테스트 구현을 유지 관리하기가 더 어려워지고 필요 이상으로 오류가 발생하기 쉽습니다).

짧은 답변은 googletest와 null을 비교할 때 ASSERT_EQ 또는 EXPECT_EQ 또는 * _TRUE의 변형을 사용해야합니다. 자세한 내용은 FAQ 항목의 링크를 참조하십시오.

+1

SaveArg는 (2)입니다. [구현 코드] (https://github.com/google/googletest/blob/48ee8e98abc950abd8541e15550b18f8f6cfb3a9/googlemock/include/gmock/gmock-more-actions.h#L172)는 그 점을 분명히합니다. – VladLosev

+0

다른 테스트 코드를 작성하여 (2)가 실제 동작임을 확인할 수 있습니다. @iheanyi VladLosev를 도와 주셔서 감사합니다. –

관련 문제