如何在执行GoogleTest时在源代码中跳过“代码”的一部分

时间:2016-03-16 16:00:21

标签: c++ unit-testing c++11 googletest gmock

我尝试在源代码中添加调试标志( GOOGLE_TEST ),并在TEST / Makefile.am中定义它。但事情没有奏效。我正在使用C ++语言。 注意:我不想在SRC目录代码中更改任何会影响生产代码及其Makefile.am

的内容。

SRC目录中的测试类

import java.util.Arrays;

public class Combinari {

    public static void combinari(int[] array, int n, int[] toPrint){
        if(n==1){
            for(int i=0;i<array.length;i++){
                for(int j=0;j<toPrint.length;j++) System.out.print(toPrint[j]);
                System.out.println(array[i]);
            }
        }
        else {
            for(int i=0;i<array.length-n+1;i++){
                int [] newToPrint = Arrays.copyOf(toPrint, toPrint.length+1);
                newToPrint[toPrint.length] = array[i];
                int [] new_array =  Arrays.copyOfRange(array, i+1, array.length);
                combinari(new_array,n-1,newToPrint);
            }
        }
    }



    public static void main(String[] args) {
        int [] array = {1,2,3,4,5,6,7};
        int [] iaka={}; // iaka est for printing :)
        combinari(array, 3, iaka);
        System.out.println("");

    }

}

测试目录中的TESTCODE

class Common: public Thread {
 public:
  friend class test_common;
  Common {
  }
  ~Common () {
  }
  virtual void ThreadMain();
 protected:
  virtual void ProcessData(void);
};
void Common::ProcessData(void) {
  #ifndef __GOOGLE_TEST__
  while (1) { }
  #endif
}

输出

GTest即使在test / makefile.am

中定义了标志之后仍然存在于While循环部分

2 个答案:

答案 0 :(得分:1)

不要依赖编译标志,不影响生产代码使用GMOCK方法摆脱while(1)循环,代码可以如下所示:

<强> TESTCODE:

class test_common : public ::testing::Test {
};
TEST_F(test_common, create_common) {
    Common commonObj();
    ON_CALL(mock_if, GetBool())
      .WillByDefault(Return(true));
    EXPECT_CALL(mock_if, GetBool())
      .Times(AtLeast(1))
      .WillOnce(Return(true))
      .WillOnce(Return(false));
    commonObj. ProcessData ();
}

摘要代码:

class AbstractIf {
 public:
  AbstractIf (void) = default;
  virtual ~AbstractIf (void) = default;
  virtual bool GetBool() = 0;
};

模拟代码:

class MockIf : public AbstractIf {
  public:
    MOCK_METHOD0(GetBool,bool());
};

消息代码:

class Common: public Thread {
 public:
  friend class test_common;
  Common {
  }
  ~Common () {
  }
  virtual void ThreadMain();
 protected:
  virtual void ProcessData(void);
  AbstractIf *prov_fl_if_;
};
void Common::ProcessData(void) {
  while (prov_fl_if_->GetBool())  { }
}

通过这种方式,我们可以跳过我们想要的代码部分,而不会影响生产代码

答案 1 :(得分:0)

无法使一个编译单元的#define值影响另一个先前编译的单元的编译。鉴于您已经规定的事情清单,您不想这样做,您将不得不使用某种形式的运行时恶作剧。

您可以使ProcessData接受一个参数,该参数确定循环是否应该迭代:

void ProcessData(bool once=false);

void Common::ProcessData(bool once) {
    do {
    // ... your loop code
    } while (!once);
}

或者您可以使用模块中定义的全局变量及其中的main(),我们可以将其称为main.cpp

生产main.cpp

const bool g_isDebugMode = false;

单元测试main.cpp

const bool g_isDebugMode = true;

main.h

extern const bool g_isDebugMode;

现在您可以针对此变量编写运行时测试。

do {
// your code
} while (g_isDebugMode == false);