我发现了一种我无法理解也无法解决的奇怪行为。我有一个工厂 FooFactory,它提供了一些真实的对象类型Foo
。为了测试Foo
我模拟的对象的方法调用FooFactory
,以这种方式MockFooFactory
返回MockFoo
我可以期待调用的对象。
测试(不包括在内)工作正常,但在 MockFooFactory 的解构期间测试 gmock/gtest 挂起(似乎是互斥问题)。准确地说,删除 Default ON_CALL 会导致创建 Mutex 时出现问题。
智能指针一定有问题,当我构建没有智能指针的版本时,它工作正常。但是我测试的软件使用 shared_ptr 作为智能指针,所以我无法摆脱它们。
这是我构建的重现错误的示例:
#include <boost/shared_ptr.hpp>
#include <gtest/gtest.h>
#include <gmock/gmock.h>
class Foo
{
public:
void doSomething() {}
};
typedef boost::shared_ptr<Foo> FooPtr;
class FooFactory {
public:
FooPtr create() {
return FooPtr(new Foo());
}
};
typedef boost::shared_ptr<FooFactory> FooFactoryPtr;
class MockFoo : public Foo {
public:
MOCK_METHOD0(doSomething, void());
};
typedef boost::shared_ptr<MockFoo> MockFooPtr;
class MockFactory : public FooFactory
{
public:
MOCK_METHOD0(create, FooPtr());
};
typedef boost::shared_ptr<MockFactory> MockFactoryPtr;
using ::testing::Return;
class Fixture : public ::testing::Test {
protected:
virtual void SetUp() {
mockFoo = MockFooPtr(new MockFoo());
mockFactory = MockFactoryPtr(new MockFactory());
ON_CALL(*mockFactory, create()).WillByDefault(Return(mockFoo));
}
MockFactoryPtr mockFactory;
MockFooPtr mockFoo;
};
TEST_F(Fixture, Test)
{
/* Not needed */
}
有没有人遇到过同样的问题或有解决方案?