当模拟将模拟作为默认值返回时,gtest在解构fixture期间挂起

时间:2013-02-22 15:18:17

标签: deadlock googletest gmock

我发现了一种我无法理解也无法解决的奇怪行为。我有一个工厂FooFactory,它提供一些Foo类型的真实对象。为了测试Foo对象的方法调用,我嘲笑FooFactory,这样MockFooFactory返回MockFoo对象,我可以期待这些对象。

测试(不包括)工作正常,但在测试gmock / gtest在MockFooFactory解构过程中挂起(似乎是互斥问题)。确切地说,删除默认ON_CALL会在创建互斥锁时导致问题。

智能指针一定存在问题,当我构建没有智能指针的版本时,它运行正常。但我测试的软件使用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 */
}

有没有人遇到同样的问题或有解决方案?

1 个答案:

答案 0 :(得分:1)

好的,更新到gmock的trunk版本后一切都很好,因为他们解决了这个问题:

https://code.google.com/p/googlemock/issues/detail?id=79