我见过有人在微软的Cpp单元测试框架中使用gmock,但每当我试图运行使用EXPECT_CALL宏的测试(见下面的示例(时,我都会在CppUnit清理测试用例的过程中遇到访问冲突。如果我注释掉EXPECT_CALL宏,那么测试将执行,断言将失败,因为默认模拟值为false。
该项目使用的是C++20(不得不对gmock进行小的编辑,使用std::invoke_result而不是std::result_of,但我不认为这是我痛苦的根源(。
有没有想过我为什么会有这个问题?
示例代码:
#include "CppUnitTest.h"
#include "gtest/gtest.h"
#include "gmock/gmock.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
class MockTest
{
public:
MOCK_METHOD(bool, Foo, (), ());
};
TEST_MODULE_INITIALIZE(ModuleInitialize) {
::testing::GTEST_FLAG(throw_on_failure) = true;
int argc = 0;
wchar_t** argv = nullptr;
::testing::InitGoogleTest(&argc, argv);
::testing::InitGoogleMock(&argc, argv);
}
TEST_CLASS(UnitTestClass)
{
public:
TEST_METHOD(TestMocking) {
MockTest mock;
EXPECT_CALL(mock, Foo)
.Times(1)
.WillOnce(testing::Return(true));
Assert::IsTrue(mock.Foo());
}
};
这可能是由于GoogleTest的默认TestEventListener
中的某些原因。我不记得到底是什么问题,但它对MS测试运行者来说并不好。我认为您也不希望设置throw_on_failure标志。
我遇到了同样的问题,并通过制作一个在MS环境中工作的自定义TestEventListener
来解决它。我在这里写了一篇文章。