gmock和转发声明的类

时间:2016-03-02 11:59:52

标签: c++ forward-declaration gmock

假设我有这个类,并且类型管理器在Base.h中向前声明。

#include <Base.h>

class MockBase : public Base
{
public:
    MOCK_CONST_METHOD0( manager, const Manager&( ) );
    ...
};

我不打算在我的测试中使用这个方法,所以我不想在测试文件中包含Manager类的定义。

但是我认为,虽然编译gmock会尝试准备错误消息并且深入其内部它需要管理器变量的地址并且我有一个错误:

  

错误C2027:使用未定义类型'Manager'   \ external \ googlemock \ gtest \ include \ gtest \ gtest-printers.h 146 1

我可以以某种方式避免包含我不会使用的方法的前向声明类型定义的文件吗?

2 个答案:

答案 0 :(得分:1)

这个想法是为UT定义一个通用的ostream运算符,该运算符仅对于前向声明的类型才被激活。它必须位于全局名称空间中。如果包含,它将解决所有类型的前向声明gmock问题。
用户仍然可以提供自定义的PrintTo函数,甚至对于前向声明的引用也是如此,因为PrintTo似乎首先被调用。它适用于gmock 1.7和GCC中的C++14

// A class to determine if definition of a type is available or is it forward declared only
template <class, class = void>
struct IsDefined : std::false_type
{};

template <class T>
struct IsDefined<T, std::enable_if_t<std::is_object<T>::value 
                                     && not std::is_pointer<T>::value 
                                     && (sizeof(T) > 0)>>
    : std::true_type
{};

// It has to be in global namespace
template <
    typename T,
    typename = std::enable_if_t<
        not IsDefined<T>::value and 
        not std::is_pointer<T>::value and 
        std::is_object<T>::value>>
std::ostream& operator<<(std::ostream& os, const T& ref)
{
    os << "Forward declared ref: " << static_cast<const void*>(&ref);
    // assert(false); // Could assert here as we do not want it to be executed
    return os;
}

答案 1 :(得分:0)

我通过定义PrintTo函数解决了这个问题,因此gtest不会尝试使用导致问题的TypeWithoutFormatter函数。这是不幸的,我不确定会有什么正确的解决办法。

namespace Foo { void PrintTo(const Bar& x, ::std::ostream* os) { *os << "Bar " << &x; }}