使用Gmock在Cpp中的另一个非虚方法中模拟非虚方法

时间:2016-04-07 14:22:44

标签: c++ unit-testing googletest gmock

我遇到了一个关于模拟需要你帮助的非虚方法的问题。 我提到了链接:Mock non-virtual method giving compilation error

我明白他们做了什么。但我有一个高级问题。假设我有:

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

using ::testing::Invoke;
using ::testing::NiceMock;

template <class myclass> class Templatemyclass {
 public:
  myclass T;
  void show() ;
};

template <class myclass> void Templatemyclass<myclass>::show()
{
    T.show_text();
}

struct Test {

  void display()  { std::cout << __func__<<":-->Inside the display Test\n"; }

  void show_text()  {
      display(); // HOW to re-route it to my_display() ? (>.<)
  }
};

struct MockTest {
  MOCK_CONST_METHOD0(display, void());
  MOCK_CONST_METHOD0(show_text, void());
};

void my_display(){
    { std::cout <<__func__<<":-->Outside the display Test\n"; }
}

int main() {
  //NiceMock<Templatemyclass<Test> > obj1;
  //obj1.show();

  NiceMock<Templatemyclass<MockTest> > obj2;
  EXPECT_CALL(obj2.T, display())
      .Times(1)
      .WillOnce(Invoke(my_display));
  obj2.show();

  return 0;
}

我希望在调用show_text时,它会调用display。我尝试模拟display并将其重新路由到my_display,但那是失败的。我收到了错误。

../test_program.cpp:56: Failure
Actual function call count doesn't match EXPECT_CALL(obj2.T, display())...
         Expected: to be called once
           Actual: never called - unsatisfied and active

稍微改变上面的源代码。它可以工作,但这错过了我的期望。我想在display中调用模拟 show_text

template <class myclass> class Templatemyclass {
 public:
  myclass T;
  void show() ;
};

template <class myclass> void Templatemyclass<myclass>::show()
{
    T.display();
}

struct Test {

  void display()  { std::cout << __func__<<":-->Inside the display Test\n"; }

//  void show_text()  {
//    display(); // HOW to re-route it to my_display() ? (>.<)
//  }
};

struct MockTest {
  MOCK_CONST_METHOD0(display, void());
  MOCK_CONST_METHOD0(show_text, void());
};

void my_display(){
    { std::cout <<__func__<<":-->Outside the display Test\n"; }
}

int main() {
  NiceMock<Templatemyclass<Test> > obj1;
  obj1.show();

  NiceMock<Templatemyclass<MockTest> > obj2;
  EXPECT_CALL(obj2.T, display())
      .Times(1)
      .WillOnce(Invoke(my_display));
  obj2.show();

  return 0;
}

屏幕显示:

display:-->Inside the display Test
my_display:-->Outside the display Test

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

您无法在EXPECT_CALLTEST宏中使用TEST_F。您的主要功能应该调用跑步者,您应该将现在的代码放在main TEST内。检查the docs