5 - Google Mock 进阶篇 -- 3.2 如何禁用不需要的调用
程序员文章站
2024-03-15 23:39:12
...
3.2 如何禁用不需要的调用
1 。 如果一个Mock函数根本不应该被调用,可以明确地指出:
using ::testing::_;
...
EXPECT_CALL(foo, Bar(_))
.Times(0); //一次都不要调用
如果对一个函数的某些调用是允许的,其它的调用则不行,则可以列出所有期望的调用:
using ::testing::AnyNumber;
using ::testing::Gt;
...
EXPECT_CALL(foo, Bar(5));
EXPECT_CALL(foo, Bar(Gt(10)))
.Times(AnyNumber());
如果一个调用不匹配任一EXPECT_CALL(),那它会产生一个错误。
2. 案例: Fool.h
#include "pch.h"
#ifndef FOOL_H_
#define FOOL_H_
class Fool {
public:
// Foo();
virtual ~Fool() {};
virtual int GetBar() const=0;
virtual void Bar(int bsize)=0;
};
#endif
FooDay.h 调用Fool对象里的方法
#pragma once
#include "pch.h"
#include "Foo.h"
class FooDay
{
Fool* foo;
int fooLaughtTimes = 0;
public:
FooDay(Fool* foo)
: foo(foo) {}
bool printBar(int stepValue) {
foo->Bar(stepValue);
fooLaughtTimes = stepValue + 1;
return true;
}
int showBar() {
fooLaughtTimes = foo->GetBar();
return fooLaughtTimes;
}
};
使用gMock方法模拟Fool里的未实现的方法
#pragma once
#include "Foo.h"
#include "gmock/gmock.h"
class MockFoo : public Fool {
public:
MOCK_CONST_METHOD0(GetBar, int());
MOCK_METHOD1(Bar, void(int bsize));
};
TestFooDay.cpp 那么在执行Gtest的时候,对已经gMock的方法,设置方法调用次数 :
用到我们前面说的:
Times(0);
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
#include "MockFool.h"
#include "FooDay.h"
#include "gtest/gtest.h"
using namespace std;
using ::testing::_;
using ::testing::AnyNumber;
using ::testing::Gt;
using ::testing::Return;
TEST(fooDayTest, showBarTest) {
MockFoo foo;
EXPECT_CALL(foo, Bar(_))
.Times(1);//一次都不要调用
EXPECT_CALL(foo, GetBar())
.WillOnce(Return(2));
FooDay fooday(&foo);
EXPECT_EQ(2, fooday.showBar())<<"Bar() function was run.";
}
以下是运行结果,Bar()运行0次:
3. 如果将: EXPECT_CALL(foo, Bar(_))
.Times(0);//一次都不要调用
改成:
EXPECT_CALL(foo, Bar(_))
.Times(1);
或者没有设置次数: EXPECT_CALL(foo, Bar(_));
这时候,这个期望返回值, 默认也是要至少调用一次。那么运行就会出错:因为测试调用Bar()一次都没有执行。