2014-03-13 78 views
0
// Filter.h/cpp 
class Filter 
{ 
public: 
    int readInt(int* value) 
    { 
     if (value == NULL) 
      return 0; 

     *value = 15; // some logical; 
     return 1; 
    } 
}; 


// TestTee.h/.cpp 
class TestTee 
{ 
public: 
    Func1(Filter* f) 
    { 
     ... 
     int val; 
     f->readInt(&val); 
     ... 
    } 
} 

现在,我需要测试TestTee课,所以我嘲笑类Filter如何使用Google测试来测试将调用包含输出参数的另一个函数的函数?

class MockFilter : public Filter 
{ 
public: 
    MOCK_METHOD1(readInt, int(int*)); 
}; 

如何编写测试用例?

TEST_F(TestClass, Test1) 
{ 
    TestTee t; 
    MockFilter filter; 

    EXPECT_CALL(filter, readInt(_)).Times(1); // failed error:  The mock function has no default action set, and its return type has no default value set." thrown in the test body. 
    /* 
    int val; 
    EXPECT_CALL(filter, readInt(&val)).Times(1); 

    Failed with the following error: 
      Expected: to be called once 
      Actual: never called - unsatisfied and active 
    */ 
    t.Func1(&filter); 
} 

所以,我的问题是

我不知道如何控制,这将在我的测试对象的功能代码调用函数的输出参数。

有何评论?多谢。

回答

0

首先,不要忘记,一个功能需要被虚拟GoogleMock才能够真正嘲笑它:

class Filter 
{ 
public: 
    virtual int readInt(int* value) 
    { 
     if (value == NULL) 
      return 0; 

     *value = 15; // some logical; 
     return 1; 
    } 
}; 

测试代码取决于你真正想要测试的内容。如果你只想确保过滤::的readInt叫这应该是足够了:

TEST_F(TestClass, Test1) 
{ 
    TestTee t; 
    MockFilter filter; 

    EXPECT_CALL(filter, readInt(_)); 

    t.Func1(&filter); 
} 

(因为已的readInt内置的返回类型(INT)GoogleMock应该能够找出默认的返回值不抱怨)。

如果你想确保的readInt被称为例如只有一次,使用次数子句:

EXPECT_CALL(filter, readInt(_)).Times(1); 

如果你想测试对象的继的readInt通话测试过程中获得足够的回报值,也就是说,如果代码你需要一个模拟模拟返回的值对于返回值使用Return子句,对于通过指针传递的输出值的SetArgPointee子句,或者两者都是这样的:

EXPECT_CALL(filter, readInt(_)).WillOnce(DoAll(SetArgPointee<0>(15), Return(1))); 
相关问题