2017-02-16 3 views
4

콜백에 대한 포인터를 저장하는 클래스 Foo이 있습니다. 콜백은 InvokeCallback() 메서드를 사용하여 호출 할 수 있습니다.Google 테스트를 사용하여 콜백 확인

void* SomeCallback(void* a) { 

    return (void*)(*(int*)a + 10); 

} 


class Foo { 

public: 

    typedef void* (*CallbackFunction)(void*); 

    SetCallback(CallbackFunction callback) { 
     this->callback = callback; 
    } 

    InvokeCallback() { 
     callback(20); 
    } 

private: 

    CallbackFunction callback; 

} 

어떻게 SomeCallback() 있음 (상기의 경우 20)는 특정 매개 변수와 함께 호출 (구글 test로) 시험 할 수있다?

는 편집 :

나는 아주 추한 찾고 해결책을했다. 테스트가 통과되었지만 끝에 새로운 오류가 나타납니다 ERROR: 1 leaked mock object found at program exit.

class MockCallbackClass { 
public: 
    MOCK_METHOD1(SomeCallback, void*(void*)); 
}; 

MockCallbackClass mock; // Nasty global variable 

void* __SomeOtherCallback(void* a) { 

    return mock.SomeCallback(a); 

} 

TEST(Callback, MockCallback) { 

    Foo foo; 
    foo.SetCallback(__SomeOtherCallback); 
    EXPECT_CALL(mock, SomeCallback((void*)10)).WillOnce(testing::Return((void*)20)); 

} 
+0

가능 duplicate : http://stackoverflow.com/questions/8942330/google-mock-unit-testing-static-methods-c –

+0

@ πάντα ῥεῖ, 이전에 질문을 확인한 후 답변을 어떻게 적용할지 알아 내지 못했습니다. 독립형 함수 콜백의 경우. – Konstantin

+0

할 수 없습니다. Google 모의 인터페이스에는 클래스 인터페이스가 필요합니다. –

답변

2
사용 std::function<void*(void*)>

testing::MockFunction<void*(void*)>std::function을 조롱합니다. 물론 이것은 구현에 약간의 변화를 요구한다 - 그러나 원시 함수 포인터가 문제없이 std::function에 저장 될 수 있기 때문에 설계의 기능은 변경되지 않습니다

class Foo { 
public: 

    using CallbackFunction = std::function<void*(void*)>; 
    // rest of this class is as it was 
}; 

그리고 시험이 같은 :

class FooTest : public testing::Test { 
public: 

    using CallbackFunctionMock = testing::MockFunction<void*(void*)>; 
    CallbackFunctionMock callbackFunctionMock; 

    Foo objectUnderTest{[this](void* v) { return callbackFunctionMock.Call(v); }}; 
}; 
TEST_F(FooTest, shallCallbackBeCalledByInvoke) 
{ 
    int a = 40; 
    EXPECT_CALL(callbackFunctionMock, Call(reinterpret_cast<void*>(20)).WillOnce(Return((void*)(&a)); 
    objectUnderTest.InvokeCallback(); 
}