我正在尝试使用GoogleMock进行UnitTest,同时也切换为假冒。
#include <gmock/gmock.h>
#include <iostream>
using ::testing::Matcher;
class Fake {
public:
void test(int, float) {}
};
class MockTest {
public:
MockTest() :
fake(new Fake()) {
}
MOCK_METHOD2(func, void(int, float));
MOCK_METHOD2(func, void(char*, int));
void delegate() {
ON_CALL(*this, func(Matcher<int>(),
Matcher<float>()))
.WillByDefault([this](int val1, float val2) {
fake->test(val1, val2);
});
}
private:
Fake *fake;
};
int main() {
MockTest *test = new MockTest();
test->delegate();
test->func(1, 5.6);
}
每当func(int,float)被调用时,我都会尝试击中假对象。它编译良好,但是遇到了段错误。 valgrind的错误消息显示:[ethan@ethan test]$ valgrind ./gmock_test
==119183== Invalid read of size 8
==119183== at 0x10DD74: MatchAndExplain (gmock-matchers.h:292)
==119183== by 0x10DD74: Matches (gmock-matchers.h:298)
==119183== by 0x10DD74: Matches<std::tuple<testing::Matcher<int>, testing::Matcher<float> >, std::tuple<int, float> > (gmock-matchers.h:908)
==119183== by 0x10DD74: Matches<std::tuple<testing::Matcher<int>, testing::Matcher<float> >, std::tuple<int, float> > (gmock-matchers.h:907)
==119183== by 0x10DD74: TupleMatches<std::tuple<testing::Matcher<int>, testing::Matcher<float> >, std::tuple<int, float> > (gmock-matchers.h:976)
==119183== by 0x10DD74: Matches (gmock-spec-builders.h:340)
==119183== by 0x10DD74: FindOnCallSpec (gmock-spec-builders.h:1497)
==119183== by 0x10DD74: testing::internal::FunctionMockerBase<void (int, float)>::DescribeDefaultActionTo(std::tuple<int, float> const&, std::ostream*) const (gmock-spec-builders.h:1650)
==119183== by 0x10CF94: testing::internal::FunctionMockerBase<void (int, float)>::UntypedDescribeUninterestingCall(void const*, std::ostream*) const (gmock-spec-builders.h:1672)
==119183== by 0x40550F5: testing::internal::UntypedFunctionMockerBase::UntypedInvokeWith(void*) (in /misc/toolchain-builds/d1ce2497ca66f4a55430c86fd8812027a7e8d5ea.x86_64/lib/libgmock.so)
==119183== by 0x10CB3E: InvokeWith (gmock-spec-builders.h:1603)
==119183== by 0x10CB3E: Invoke (gmock-generated-function-mockers.h:121)
==119183== by 0x10CB3E: MockTest::func(int, float) (test.cc:19)
==119183== by 0x10C957: main (test.cc:37)
==119183== Address 0x0 is not stack'd, malloc'd or (recently) free'd
有人可以告诉我该如何处理吗?
最佳答案
问题出在这里的匹配器
ON_CALL(*this, func(Matcher<int>(),
Matcher<float>()))
::testing::Matcher<T>
的默认构造函数创建空实现(gtest / gtest-matchers.h):
327 // Constructs a null matcher. Needed for storing Matcher objects in STL
328 // containers. A default-constructed matcher is not yet initialized. You
329 // cannot use it until a valid value has been assigned to it.
330 explicit Matcher() {} // NOLINT
您需要使用any
匹配器来实现以下目的:ON_CALL(*this, func(_, _))
或者,因为您已重载了此功能,请使用A/An
匹配器:
ON_CALL(*this, func(An<int>(), A<float>()))
PS。A和An之间没有真正的区别-只是英语语法:)
关于c++ - Google模拟内部段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63199667/