2013-05-10 450 views
6

我试图写模拟为包含三个重载方法的类,即:GMock - 与ON_CALL返回默认值重载方法

#include <gtest/gtest.h> 
#include <gmock/gmock.h> 

using ::testing::_; 
using ::testing::Return; 
using ::testing::A; 
using ::testing::ByRef; 
using ::testing::Ref; 
using ::testing::TypedEq; 

struct Foo { 
    int fooMethod(const int& intParam) { return 0; } 
    int fooMethod(const float& floatParam) { return 0; } 
    int fooMethod(const std::string& stringParam) { return 0; } 
}; 

struct FooMock { 
    FooMock() { 
    ON_CALL(*this, fooMethod(_)).WillByDefault(Return(-1)); 
    } 

    MOCK_METHOD1(fooMethod, int(const int& intParam)); 
    MOCK_METHOD1(fooMethod, int(const float& floatParam)); 
    MOCK_METHOD1(fooMethod, int(const std::string& stringParam)); 
}; 

但是这给出了一个错误:

error: call of overloaded ‘gmock_fooMethod(const testing::internal::AnythingMatcher&)’ is ambiguous 

我也尝试了TypedEq()而不是“_”,但它给出了更多的晦涩的错误。我检查了GMock常见问题,维基和我没有找到解决方案 - 我怎样才能返回默认值与ON_CALL重载的方法?

BR, 卢卡斯

回答

10

@ tx34有答案的症结所在,但代码中还有一些问题。

首先,Selecting Between Overloaded Functions上的文档是最合适的。您有三个过载fooMethod具有相同数量的参数但参数类型不同。你将不得不使用指定类型的匹配器。

接下来,你需要定义你的所有Foo功能将被嘲笑为virtual,或者调用它们通过Foo对象将不会调用派生模拟功能。由于您将Foo定义为基类,因此它应该具有虚拟析构函数以避免切片。

最后,您需要从Foo继承FooMock

所以把他们放在一起,你最终的东西,如:

#include <memory> 
#include <string> 
#include "gtest/gtest.h" 
#include "gmock/gmock.h" 

using ::testing::_; 
using ::testing::An; 
using ::testing::Matcher; 
using ::testing::TypedEq; 
using ::testing::Return; 

struct Foo { 
    virtual ~Foo() {} 
    virtual int fooMethod(const int&) { return 0; } 
    virtual int fooMethod(const float&) { return 0; } 
    virtual int fooMethod(const std::string&) { return 0; } 
}; 

struct FooMock : Foo { 
    FooMock() : Foo() { 
    ON_CALL(*this, fooMethod(An<const int&>())). 
     WillByDefault(Return(-1)); 
    ON_CALL(*this, fooMethod(Matcher<const float&>(_))). 
     WillByDefault(Return(-2)); 
    ON_CALL(*this, fooMethod(TypedEq<const std::string&>("1"))). 
     WillByDefault(Return(-3)); 
    } 

    MOCK_METHOD1(fooMethod, int(const int& intParam)); 
    MOCK_METHOD1(fooMethod, int(const float& floatParam)); 
    MOCK_METHOD1(fooMethod, int(const std::string& stringParam)); 
}; 

TEST(Foo, foo) { 
    std::shared_ptr<Foo> foo(new FooMock); 
    auto foo_mock(std::dynamic_pointer_cast<FooMock>(foo)); 

    EXPECT_CALL(*foo_mock, fooMethod(Matcher<const int&>(_))).Times(1); 
    EXPECT_CALL(*foo_mock, fooMethod(Matcher<const float&>(_))).Times(1); 
    EXPECT_CALL(*foo_mock, fooMethod(Matcher<const std::string&>(_))).Times(1); 

    EXPECT_EQ(-1, foo->fooMethod(1)); 
    EXPECT_EQ(-2, foo->fooMethod(1.0f)); 
    EXPECT_EQ(-3, foo->fooMethod("1")); 
} 


int main(int argc, char **argv) { 
    testing::InitGoogleTest(&argc, argv); 
    return RUN_ALL_TESTS(); 
} 
+0

TX34,弗雷泽 - 谢谢! – lgromanowski 2013-05-22 09:01:00

2

的问题是TypedEq预计值不是匹配。你可以实现你想要的方式:

ON_CALL(*this, fooMethod(An<ArgType>())).WillByDefault(Return(-1)); 

ON_CALL(*this, fooMethod(Matcher<ArgType>(_))).WillByDefault(Return(-1)); 

参见:

https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md#selecting-between-overloaded-functions

https://github.com/google/googletest/blob/master/googlemock/docs/CheatSheet.md#wildcard

https://github.com/google/googletest/blob/master/googlemock/docs/CheatSheet.md#generic-comparison