2017-09-07 64 views
1

我已經它接受一個指針到另一個類和有一個方法讀()的一類:GMOCK - 如何修改該方法的參數時返回類型爲void

class B: 
{ 
public: 
...... 
void read(char * str); 
...... 
}; 

class A 
{ 
public: 
A(B *bobj):b(bobj); 
B* b; 
void read (char * str); 
.......... 
}; 

我調用對象像下面

A * aobj = new A(new B()); 

現在我應該能夠同時訪問類的讀取方法,象下面這樣:

char text[100]; 
b->read(text) 
aobj->read(text) 

的方法R A和B類的ead被編碼,以便根據提供的將一些值複製到輸入數組。

我該如何寫函數的MOCK方法來將參數修改爲特定值?

ON_CALL(*b, read(::testing::_)).WillByDefault(::testing::Return(outBuffer)); 

給我一個編譯問題,因爲read方法無法按照定義返回值?

回答

1

我已經使用Invoke函數來實現這一點。這是一個示例代碼。

如果使用> = C++ 11,那麼您可以簡單地將一個lambda賦給Invoke函數。

#include <gtest/gtest.h>                                                
#include <gmock/gmock.h> 

using ::testing::Mock; 
using ::testing::_; 
using ::testing::Invoke; 

class actual_reader 
{ 
    public: 
    virtual void read(char* data) 
    { 
     std::cout << "This should not be called" << std::endl; 
    } 
}; 
void mock_read_function(char* str) 
{ 
    strcpy(str, "Mocked text"); 
} 

class class_under_test 
{ 
    public: 
     void read(actual_reader* obj, char *str) 
     { 
     obj->read(str); 
     } 
}; 

class mock_reader : public actual_reader 
{ 
    public: 
    MOCK_METHOD1(read, void(char* str)); 
}; 


TEST(test_class_under_test, test_read) 
{ 
    char text[100]; 

    mock_reader mock_obj; 
    class_under_test cut; 

    EXPECT_CALL(mock_obj, read(_)).WillOnce(Invoke(mock_read_function)); 
    cut.read(&mock_obj, text); 
    std::cout << "Output : " << text << std::endl; 

    // Lambda example 
    EXPECT_CALL(mock_obj, read(_)).WillOnce(Invoke(
      [=](char* str){ 
       strcpy(str, "Mocked text(lambda)"); 
      })); 
    cut.read(&mock_obj, text); 
    std::cout << "Output : " << text << std::endl; 



} 
+0

謝謝 - 能否請您提供拉姆達功能,因爲我使用C++ 11 – Prakash

+0

應該是簡單的,我將它添加 –

+0

謝謝 - 是它也可以通過用戶無視議論同一個實際沿 - 東西就像 - 調用(mock_read_function(_,「這是一個測試」))其中_是實際參數調用和下一個是用戶定義與可能是int,數組等在這種情況下,它是一個字符串 – Prakash

相關問題