- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试为包含三个重载方法的类编写模拟,即:
#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 常见问题解答、Wiki,但没有找到解决方案 - 如何使用 ON_CALL 为重载方法返回默认值?
BR,卢卡斯
最佳答案
@tx34 找到了答案的关键,但代码中还有一些问题。
首先,Selecting Between Overloaded Functions 上的文档是最合适的。您有三个 fooMethod
重载,它们具有相同数量的参数但不同的参数类型。您将不得不使用指定类型的匹配器。
接下来,您需要定义所有要模拟为virtual
的Foo
函数,或者通过Foo
对象调用它们不会调用派生的模拟函数。由于您将 Foo
定义为基类,它还应该有一个虚拟析构函数以避免切片。
最后,您需要让 FooMock
继承自 Foo
。
所以把它们放在一起,你最终会得到类似这样的东西:
#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();
}
关于c++ - GMock - 使用 ON_CALL 为重载方法返回默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16479907/
我正在尝试为包含三个重载方法的类编写模拟,即: #include #include using ::testing::_; using ::testing::Return; using ::tes
给定: #include "gmock/gmock.h" #include using namespace testing; // tsk, tsk // -- -- -- -- -- -- --
是否可以使用 ON_CALL WillByDefault 返回不同的值?例如 class FooMock { MOCK_METHOD0(foo, int()); } void bar() {
我通读了Google Mock: Return() a list of values并找出如何在每个 EXPECT_CALL 上从 vector 返回单个元素,因此我编写了以下有效的代码: {
我想测试我系统的方法,它的返回值部分依赖于调用某种连接接口(interface)的返回值。在大多数情况下,我希望 IConnection 在对它的 open(_, _) 方法进行任何类型的调用时返回
我不明白 ON_CALL 和 EXPECT_CALL 使用时的区别指定默认操作。 到目前为止,我注意到/了解到有两种方法可以调整模拟的默认操作: ON_CALL(mock, methodX(_)).W
在 ON_CALL 语句和 EXPECT_CALL 语句之后,有没有人在 gmock 中看到过奇怪的行为?对我来说,以下代码中的 EXPECT_CALL 语句不起作用(它实际上并不强制执行 Times
我是一名优秀的程序员,十分优秀!