Учитывая интерфейс класса Foo:
#ifndef FOO_H
#define FOO_H
#include <string>
class Foo
{
public:
Foo() = default;
virtual ~Foo() = default;
virtual void bar(std::string msg) = 0;
};
#endif
Его макет:
#ifndef FOO_MOCK_H
#define FOO_MOCK_H
#include "gtest/gtest.h"
#include "gmock/gmock.h"
class MockFoo: public Foo
{
public:
MOCK_METHOD(void, bar, (std::string), (override));
};
#endif
И глупый тест:
#include "pch.h"
#include "gtest/gtest.h"
#include "gmock/gmock.h"
#include "MockFoo.h"
using ::testing::NiceMock;
TEST(SillyTests, Silly)
{
std::string msg = "Hello, world!";
NiceMock<MockFoo> mock_foo;
EXPECT_CALL(mock_foo, bar)
.Times(1);
mock_foo.bar(msg);
}
Среди множества ошибок внутренних для gtest и gmock Visual Studio жалуется на MOCK_METHOD()
, что "имя, сопровождаемое '::' должно быть именем класса или пространства имен", и что определение функции для MOCK_METHOD
не найдено.
Интересно добавление старого вызова функции MOCK_METHODn
приводит к той же ошибке.
MOCK_METHOD1(debug, void(std::string msg));
При наведении курсора на MOCK_METHOD
отображается несколько подтверждений c, но они не являются правильными. Они включают:
"(std::string)"
должны быть заключены в круглые скобки (это так) "(override)"
должны быть заключены в круглые скобки (опять же, это так) - Подпись должна быть типом функции, возможно, возвращаемый тип содержит незащищенную запятую (это тип
void
, добавление скобок не исправляет это) - Этот метод не принимает аргументы "1". Скобки всех типов с незащищенными запятыми
версия gmock - 1.10.0, версия адаптера Google Test - 1.8.1.3.