Google Test Expect来自函数的调用



假设我有一个简单的mock测试。

#include "boost/interprocess/detail/interprocess_tester.hpp"
#include <gtest/gtest.h>
#include <gmock/gmock.h>
using namespace ::testing;
struct IInterface
{
virtual void method(int foo) = 0;
};
struct SimpleMock : public IInterface
{
MOCK_METHOD1(method, void(int foo));
};
struct TestFixture : public Test
{
TestFixture()
{
// Don't care about other invocations not expected
EXPECT_CALL(mock, method(_)).Times(AnyNumber());
}
void setupExpectation(int data)
{
EXPECT_CALL(mock, method(data)).Times(1);
}
SimpleMock mock;
};
TEST_F(TestFixture, SimpleTest)
{
setupExpectation(2);
mock.method(2);
setupExpectation(5);
mock.method(3); // will fail expectation
}

这将失败,因为下面的消息引用到helper方法中,这使得调试或计算哪个期望失败变得困难,因为我看不到我调用的setupExpectation行或实际的参数值。

test_HarmonicTherapyStateMachineAit.cpp:27: Failure
Actual function call count doesn't match EXPECT_CALL(mock, method(data))...
Expected: to be called once
Actual: never called - unsatisfied and active

请注意,我的实际用例有更复杂的期望调用,我认为有必要将其拆分为一个单独的方法(并且在一个测试中有多个期望(。然而,我不知道如何从中获得更具信息性的错误消息。

我读过关于http://google.github.io/googletest/gmock_cook_book.html#controlling-gmock打印了多少信息。然而,这提供了比我真正想要的更多的信息,这只是调用setupExpectation的函数的行号。

我还试着做了一个MACRO来包装共同的期望。在这种简单的情况下,这很容易。然而,我的实际用例有更复杂的逻辑,我宁愿不把它放在宏中。

即使我能做一些类似EXPECT_CALL(...).Times(1) << "argument: " << foo;的事情,那也会很有帮助。

如有任何帮助,我们将不胜感激。

目前我遇到了同样的问题,gmock为我提供的信息很少。我的解决方案是编写一个自定义Matcher。

EXPECT_CALL宏的语法根据文档:

EXPECT_CALL(mock_object, method(matchers))

一个快速的解决方案可以是编写一个匹配器,在出现错误时,它会在屏幕上打印一条消息。

例如:

MATCHER_P2(isEqual, expected, line, "")
{
bool isEqual = arg == expected;
if(!isEqual)
printf("Expected argument: %d, actual: %d (EXPECT_CALL line: %d)n", expected, arg, line);
return isEqual;
}

EXPECT_CALL随后变为

EXPECT_CALL(mock, method(isEqual(3, __LINE__))).Times(1);

如果你有其他/更好的解决方案,请告诉我。

最新更新