我写了一个Google测试(使用Google Mock)。以下是相关代码:
MockObj * obj = new MockObj ();
MockDI * mock_di = new DI();
MockDIPtr mock_di_ptr(mock_di); // boost shared ptr
Data data; // sort of on array
data.append(1); data.append(2); // Add two entries
EXPECT_CALL(*obj, get_di_ptr()).WillOnce(Return(mock_di_ptr));
EXPECT_CALL(*mock_di_ptr, get_data(_,_)).WillOnce(SetArgReferee<1>(data));
EXPECT_CALL(*obj , enqueue(_)).Times(2);
实际实施是:
di_ptr->get_data(int, data); // data is updated via reference
for (int i = 0; i < data.size(); ++i)
{
enqueue(data[i]);
}
基本上,对于数据中的每个条目,应该调用enqueue()
一次。此外,嘲笑是正常的嘲笑(不是严格等)。
当我检查Times(2)
时,正如预期的那样,这个测试通过。
当我检查Times(0)
或Times(1)
时,正如预期的那样,此测试失败。
但是,当我检查Times(3)
时,这个测试通过了!
为什么呢?我该怎么做才能发现这种行为?
答案 0 :(得分:2)
MockDI * mock_di = new DI();
可能应该阅读MockDI * mock_di = new MockDI();
以使第EXPECT_CALL(*mock_di_ptr, get_data(_,_)).WillOnce(SetArgReferee<1>(data));
行有效。
aleguna提出了一个很好的观点。以下简化实验会产生错误Actual function call count doesn't match EXPECT_CALL(mock, mockMe(_))...
。我建议调试测试中的方法,并在data.size()
之后检查di_ptr->get_data()
。然后在Data::append()
中设置一个断点,看看谁添加了更多元素。
#include "gtest\gtest.h"
#include "gmock\gmock.h"
using ::testing::_;
class Dependency
{
public:
virtual ~Dependency() {}
virtual void mockMe(int i);
};
void Dependency::mockMe(int i)
{
}
class MockDependency : public Dependency
{
public:
MOCK_METHOD1(mockMe, void (int i));
};
class Cut
{
public:
void testMe(Dependency& dependency);
};
void Cut::testMe(Dependency& dependency)
{
for (int i=0; i<2; ++i)
{
dependency.mockMe(i);
}
}
TEST(Experiment, VerifyExactCallCount)
{
MockDependency mock = MockDependency();
Cut cut;
EXPECT_CALL(mock, mockMe(_)).Times(3);
cut.testMe(mock);
}