2017-04-14 1 views
0

googlemock 및 googletest의 도움을 받아 테스트중인 메소드에서 다른 조롱 된 오류가 올바르게 처리되는지 확인하는 테스트를 설정합니다. 기본적으로 내 코드는 다음과 같습니다googlemock 작은 동작 변형이있는 EXPECT_CALL

// setup mock object, and object under test 

    // setup initial EXPECT_CALL expectations 

    // this expected method call in the middle mocks a failure 
    EXPECT_CALL(*mock, method(arg_in)). 
    Times(1). 
    WillOnce(Throw(exception_of_type_A)); 

    // setup cleanup EXPECT_CALL expectations 

    // Now invoke method in object under test. 
    // Expect exception has been translated to different type. 
    EXPECT_THROW(x.method_under_test(), exception_type_B); 

    // destructor of mock object will check the mock method invocations 

이제 A 형의 예외를 던져 실패 할 수 있습니다뿐만 아니라 여기에 실패,뿐만 아니라 B ​​형의 예외를 던지는 내 조롱 방법을, 또는 예기치 않은 리턴 값을 반환하여 .

완벽하게 TEST()를 복사하여 붙여 넣기 만하면됩니다. 잘못 구현 된 메소드 1이 수행 할 작업을 변경하면됩니다. 그러나 이렇게하면 코드가 지저분해질 것입니다. 이 3 가지 테스트가 조롱 된 메소드 1이 WillOnce() 액션 스펙에서 어떻게 실패했는지를 제외하고는 똑같은 것으로 문서화하더라도, 사람 독자는 여전히 이것이 사실이라면 여전히 신중하게 비교해야 할 것입니다.

googletest/googlemock에서 3 개의 TESTS 사이에 공통 코드를 공유하고 WillOnce() 동작이 서로 다른 올바른 방법은 무엇입니까?

내 생각에 매크로 : 매크로, WillOnce() 액션이있는 컨테이너의 루프, googletest fixtures, 설정 및 정리를위한 정적 도우미 메소드.

저는 아직 googletest를 처음 사용하고 있으며이를 해결하는 방법을 모르겠습니다.

답변

0

지금, 나는 매개 변수로 작업을 허용하는 템플릿 정적 함수에서 테스트 로직을 구현 :이 그것을 수행, 또는 방법의 경우

template <typename A> 
static void paramererizeable_test(A failingAction) { 
    // set everything up 
    EXPECT_CALL(*mock, method(arg_in)). 
    Times(1). 
    WillOnce(failingAction); 
    // set up more expectations 
    // trigger the calls 
} 

TEST(Section, Method) { 
    paramererizeable_test(Throw(exception_of_type_A)); 
    paramererizeable_test(Throw(exception_of_type_B)); 
    paramererizeable_test(Return(unexpected_return_value)); 
} 

확실하지 더 나은 방법이 있는지 ,하지만 그것은 작동하고 읽을 수 있습니다.

관련 문제