首页 > 其他分享 >单元测试2-gmock及MOCK_METHOD学习

单元测试2-gmock及MOCK_METHOD学习

时间:2024-01-01 22:33:43浏览次数:37  
标签:gmock testing 单元测试 argv gtest argc METHOD mock

转自:https://www.cnblogs.com/welkinwalker/archive/2011/11/29/2267225.html,https://www.cnblogs.com/pugang/p/9500352.html

1.介绍

#include <gmock/gmock.h>
#include <string>

class FooInterface {
public:
        virtual ~FooInterface() {}

public:
        virtual std::string getArbitraryString() = 0; //mock的函数必须是虚函数(gmock的局限性)
};

class MockFoo: public FooInterface {//需要继承已有的类
public:
        MOCK_METHOD0(getArbitraryString, std::string());//宏0表示mock的函数形参数量为0
};
//调用case:
    1. int main(int argc, char** argv) {
    2.         ::testing::InitGoogleMock(&argc, argv);
    3.  
    4.         string value = "Hello World!";
    5.         MockFoo mockFoo;
    6.         EXPECT_CALL(mockFoo, getArbitraryString()).Times(1).
    7.                 WillOnce(Return(value));
    8.         string returnValue = mockFoo.getArbitraryString();
    9.         cout << "Returned Value: " << returnValue << endl;
    10.  
    11.         return EXIT_SUCCESS;
    12. }

gmock 依赖C++多态机制进行工作,只有虚函数才能被mock, 非虚函数不能被mock。 派生类中的同名函数仍然是虚函数,同样支持多态,支持gomck。类实例以引用类型传入,不能mock相应的接口,以引用类型传入的成员变量本身不具备多态特性,因此gmock不支持。

EXPECT_CALL:

EXPECT_CALL(mock_object, method(matcher1, matcher2, ...))//mock对象,mock的方法
    .With(multi_argument_matcher)
    .Times(cardinality)//基数,运行几次,可选
    .InSequence(sequences)
    .After(expectations)
    .WillOnce(action)// 一次调用时所产生的行为
    .WillRepeatedly(action) // 缺省/重复行为。
    .RetiresOnSaturation();

例子:

EXPECT_CALL(mockTurtle, getX()).Times(testing::AtLeast(5)). //至少运行5次
                WillOnce(testing::Return(100)).WillOnce(testing::Return(150)).//第一次返回100,第二次返回150,之后3次返回200
                WillRepeatedly(testing::Return(200))

2.元素

2.1 matcher匹配器

官方链接:https://google.github.io/googletest/reference/matchers.html

期望传入的参数符合的条件,_表示任何值,不用检查。有些比较大小的函数等。//比较高阶的用法。

2.2 Actoins行为

2.3 序列Sequences 

直接定义一个对象,InSequence dummy;,执行时按照EXPECT_CALL声明的顺序来即可。

gmock还可以mock protected/private方法。

3. 运行

https://www.cnblogs.com/coderzh/archive/2009/04/10/1432789.html,链接中有系列文章,想进阶可以再学习

对于运行参数,gtest提供了三种设置的途径,优先级依次从低到高:

  • 1. 系统环境变量。--gtest_output对应的系统环境变量为:GTEST_OUTPUT
  • 2. 代码中指定FLAG。testing::GTEST_FLAG。
  • 3.命令行参数。因为在初始化时接收了命令行参数 testing::InitGoogleTest(&argc, argv); 
int _tmain(int argc, _TCHAR* argv[])
{
    testing::GTEST_FLAG(output) = "xml:"; //指定flag,--gtest_output
    testing::InitGoogleTest(&argc, argv); //命令行参数优先级更高,--gtest_output
    return RUN_ALL_TESTS();
}

命令行参数:

  • --gtest_filter,支持通配符过滤执行

 

标签:gmock,testing,单元测试,argv,gtest,argc,METHOD,mock
From: https://www.cnblogs.com/BlueBlueSea/p/17939395

相关文章

  • 在 SSM 项目中使用 Junit 进行单元测试
    Junit 一个轻量级的单元测试框架,我在这里使用 Junit 对 service 层进行测试,每实现一个功能就进行测试,这样就可以保证在Controller层中调用不会因为service 层的错误而出错。1. 项目目录 项目目录如下图所示:代码放在java 文件夹中,resources 文件夹放的是一些xml配置文件......
  • .net core 单元测试项目搭建
    背景和目的为了提高系统稳定性,通常我们有两方面的计划:黑盒测试:自动化测试,以接口来主体,通过控制入参的形式,检验出参,来模拟用户在线上的实际业务;(可以覆盖绝大部分的业务)白盒测试:单元测试,以关键逻辑方法为主体,通过控制入参的形式,检验数据变化,站在开发的角度上来模拟实际调用(可以......
  • 代码整洁之道:边界、单元测试、类
    来源:博客园(作者-BNDong)边界边界上的代码需要清晰的分割和定义了期望的测试。应该避免我们的代码过多地了解第三方代码中的特定信息。依靠你能控制的东西,好过依靠你控制不了的东西,免得日后受它控制。单元测试TDD三定律在编写不能通过的单元测试前,不可编写生成代码......
  • java单元测试
    一、单元测试1、概述 2、优缺点 二、快速入门   三、JUNIT的常用注解 ......
  • 405错误---Request method 'POST' not supported
     错误:Requestmethod'POST'notsupported--方法不支持  解决: 多数情况下,是由于GET,POST,DELETE,PUT等方法类型不一致导致的。 所以将请求方法改回就好。例:此处的@Get方法改为@Post   ......
  • 神经网络优化篇:详解其他正则化方法(Other regularization methods)
    其他正则化方法除了\(L2\)正则化和随机失活(dropout)正则化,还有几种方法可以减少神经网络中的过拟合:一.数据扩增假设正在拟合猫咪图片分类器,如果想通过扩增训练数据来解决过拟合,但扩增数据代价高,而且有时候无法扩增数据,但可以通过添加这类图片来增加训练集。例如,水平翻转图片,并......
  • AspNetCore的单元测试
    一、单元测试项目如何创建VisualStudio新建项目,项目类型选择测试。 可以看到有许多选项,都大差不差。这里选择xUnit。项目名使用要测试的项目名加上“.Tests”后缀。二、进行单元测试首先明确测试对象,通常是针对一个类型进行测试,新建Test类,类名为测试对象的类名加上“Test......
  • 爬虫遇到abort method will be deleted later!怎么解决
    当你在爬虫过程中遇到`abort`methodwillbedeletedlater!的错误时,这通常是由于网站的反爬虫机制所导致的。网站为了防止被爬虫程序过度访问,会设置一些限制,例如频率限制、验证码验证等。为了解决这个问题,你可以尝试以下几种方法:1.增加延迟:在发送HTTP请求之间增加一定的延迟时间,可......
  • 单元测试 - Mockito - 2
    3.Mockito中常用注解3.1可以代替Mock方法的@Mock注解Shorthandformockscreation-@MockannotationImportant!Thisneedstobesomewhereinthebaseclassoratestrunner:快速mock的方法,使用@mock注解。mock注解需要搭配MockitoAnnotations.openMo......
  • Java Junit 单元测试使用示范(带截图)
    依赖包junit-4.7.jar@Test注解packagejunit;importorg.junit.Test;/***选中add,右键运行add()*/publicclassDemo1{@Testpublicvoidadd(){inta=10;intb=13;intsum=a+b;System.out.println(sum);}......