欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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次:

5 - Google Mock 进阶篇 -- 3.2 如何禁用不需要的调用

3. 如果将:    EXPECT_CALL(foo, Bar(_))
        .Times(0);//一次都不要调用

改成:

    EXPECT_CALL(foo, Bar(_))
        .Times(1);

或者没有设置次数:    EXPECT_CALL(foo, Bar(_));

 这时候,这个期望返回值, 默认也是要至少调用一次。那么运行就会出错:因为测试调用Bar()一次都没有执行。

5 - Google Mock 进阶篇 -- 3.2 如何禁用不需要的调用