【问题标题】:Gmock for static methods静态方法的 Gmock
【发布时间】:2016-03-08 04:34:56
【问题描述】:

我正在使用 Gmock 进行测试。我有一个所有方法都是静态的类。 例如

class A
{
  static int Method1(int x,int y){return (x+y)};
};

如何使用 Gmock 测试这个类。 请帮帮我。 谢谢

【问题讨论】:

  • 我猜你是在问如何模拟这些方法,对吧?不测试课程,因为在您的示例中这将是微不足道的
  • 这样的。类 B { void xyz{ A::Method1(x,y)} } 就是这种情况。我如何 Gtest B 类。我知道我必须模拟 A 类。但不对源代码进行任何更改。如何我测试 B?
  • 如果不进行修改,您无法在测试 B 类时模拟 Method1。鉴于您的示例,给出具体建议有点困难,因为对 Method1 的调用毫无意义。如果你只是想验证调用是否正确,也许在 B 的构造函数中注入静态方法,并在测试时传递一个模拟函数。
  • 谢谢。但是我无法更改代码。可以使用存根吗?如果可以如何?

标签: testing controller agent


【解决方案1】:

如果不修改代码,您将无法做到这一点。但是您可以将您的应用程序与存根对象链接起来。只需创建另一个“A 类”实现并将其与您的测试应用程序链接。

【讨论】:

    【解决方案2】:
    • 抱歉,我之前的回答不足以解释您的问题。 *

    到目前为止,gmock 不支持模拟静态函数和非虚拟函数。当您在遗留代码中有一个虚拟方法,并且当您能够将一个新的模拟类作为子类放入其中时,它就可以工作。 我建议使用“jomock”的新解决方案,它支持在不更改旧代码的情况下模拟旧的全局函数、静态方法和非虚拟方法。

    // for your example.. 
    class A
    {
      static int Method1(int x,int y){return (x+y)};
    };
    
    #include "jomock.h"
    TEST(JoMock, testStaticFunction) 
    {
        EXPECT_CALL(JOMOCK(A::Method1), JOMOCK_FUNC(_,_))
            .Times(Exactly(1))
            .WillOnce(Return(1));
    
        EXPECT_EQ(A.Method1(1,2), 1);    
    }
    // this is a little modification from the jomock example.
    // https://github.com/jonah512/jomock
    

    【讨论】:

      【解决方案3】:

      您可以通过创建独立的模拟类来做到这一点,该模拟类不会派生自您需要模拟的类。以下是您将如何做到的。

      Step - 1 : 注释具有静态函数的类

      // Comment the class
      /*
          class A 
          {
            static int Method1(int x,int y){return (x+y)};
          };
      */
      

      步骤 - 2:创建一个与 A 同名的 Mock 类,并在其中模拟 Method1。请注意,它不是从原始类派生的

      class A  {
      public:
          MOCK_METHOD2(Method1, int(int x, int y));
      };
      

      让我们假设使用静态函数的类需要模拟它UsingA。可以这样写。

      class UsingA {
          A  &a1;
      public:
          UsingA(A & _a1) : a1(_a1) {} 
          int CallFn() {
              // Original function that needs to be commented
              // return a1::Method1(10,25);
              return a1.Method1(10, 20);
          }
      };
      

      那么这里是你将如何编写测试

      TEST(MyMockTest, Method1Test) {
          A mstat;
          UsingA ua(mstat);
      
          EXPECT_CALL(mstat, Method1(_,_))
          .Times(1)
          .WillOnce(Return(100));
      
          int retVal = ua.CallFn();
      
          EXPECT_EQ(retVal,100); 
      
      }
      

      可能不是最好的方法,但服务于目的。希望对你有帮助

      【讨论】:

        猜你喜欢
        • 2016-01-02
        • 1970-01-01
        • 2011-01-17
        • 1970-01-01
        • 1970-01-01
        • 2012-07-14
        • 2018-10-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多