问题标签 [googlemock]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
238 浏览

c++ - 您可以使用 googlemock 对不属于某个类的函数设置期望吗?

如果在我的 main 中有一个从 main 调用的函数 func,我可以使用 googlemock 说 EXPECT_CALL( no_class_here , func).Times(1) 吗?

no_class_here类似于范围运算符,表示它不属于一个类,::。我不知道这将如何工作,但在功能实现中

我不想将 func 放在一个类中,因为它只是一个静态函数并且不需要一个类来运行......

我应该放弃并一直把我要测试的所有东西都放在课堂上吗?我知道 JUnit 和 JMock,Java 中的一切都是一个类,所以别无选择,但我想能够从一个只有虚函数的类继承下来的能力可能是允许 googlemock 完成工作的机制......

0 投票
3 回答
2894 浏览

c++ - googlemock - 模拟返回复杂数据类型的方法

我想模拟一个返回复杂数据类型的方法

此代码无法编译:“宏“MOCK_CONST_METHOD0”传递了 3 个参数,但只需要 2 个”

我认为 googlemock 宏不理解 QMap 并将逗号解释为参数分隔符。

有没有办法告诉 googlemock QMap 是返回值?

0 投票
1 回答
1543 浏览

c++ - 模拟整个库

我正在开发使用boost::asio. 为了测试它,我需要从这个库中模拟一组类。我正在使用 Google Mock,它允许模拟虚拟方法。通常(且乏味)的过程是为我需要使用的每个类编写一个接口。

另一方面,Google Mock Cookbook 描述了模拟非虚拟方法的另一种方法:使用模板。我的问题是我可能需要同时模拟几个类(所以直接使用模板是行不通的)。于是我想:为什么不用两级模板呢?我想出了以下解决方案:

然后,正常的用法是:

虽然测试将是:

当被模拟的类具有带有复杂参数的方法(例如来自同一库的其他类可能未被模拟)时,这开始变得复杂。总而言之,它似乎没有规模化。对这个解决方案有什么想法,或者对解决问题的其他方法有什么建议吗?

0 投票
1 回答
22130 浏览

c++ - 为什么 GoogleMock 会泄露我的 shared_ptr?

我使用 GoogleMock/GoogleTest 进行测试,当匹配器将 shared_ptr 作为模拟参数并在同一个 shared_ptr 上调用 EXPECT 时,我看到了一些奇怪的行为。有问题的代码:

运行此测试时,我得到

知道为什么会这样吗?我宁愿不用Mock::AllowLeak

0 投票
2 回答
1486 浏览

c++ - Googletest - DeathTest 无法从 Qt 应用程序(例如 Q_ASSERT 等)捕获断言。

我想用 gtest 测试一个断言。该方法如下所示:

测试看起来像这样:

这个测试适用于 linux 下的 gcc。

但是在windows下的visual studio 2010这个测试有问题。

当我运行测试时,会打开一个错误窗口。它显示断言失败。当我关闭窗口时,所有测试都完成了。没有测试失败。

我认为 gtests 启动了一个导致断言失败的新进程并评估进程输出。这有效并且测试通过。

但是当 Visual Studio 注意到新进程失败时,它会创建错误窗口。

如何抑制错误窗口?

0 投票
2 回答
18957 浏览

c++ - 将 googlemock EXPECT_CALL 与 shared_ptr 一起使用?

我有一个测试可以很好地使用原始指针,但是我无法让它与std::shared_ptr. 类是这样的:

我的测试代码是这样的:

在这个测试中,service_是在测试中的堆栈上创建的模拟/伪造,我将地址传递给MyClass. 更改MyClassservicea shared_ptr,我的新课程如下所示:

我在测试中尝试的是:

但是,当我这样做时,测试失败并显示:

简而言之,我需要一个shared_ptrto service_(这是一个假对象)来传递给MyClass构造函数,并且我需要一个函数的非指针EXPECT_CALL。我怎样才能让它正常工作?

更新

尝试动态分配 SomeServiceFake 以获取 shared_ptr 然后使用 * 运算符 on service_,这让我“更进一步”,但现在我收到以下错误:

更新 2

使用Mock::AllowLeak(service_.get());所以我现在可以解决这个问题。希望我能得到答案。

0 投票
1 回答
1126 浏览

c++ - 单元测试采用“特征”模板参数的对象

我有一个 Visual Studio 2008 C++03 项目,我想在其中对一个使用公开静态方法(基于策略的设计、策略模式)的特征模板参数的类进行单元测试。我正在使用 Google Test 和 Google Mock 框架。

例如:

显然这不会按原样工作。Google Mock 不能模拟静态方法,我需要在测试中创建一个 Mocked 类的实例来设置它的行为和期望。

那么使用 Google Test / Google Mock 对接受模板策略的类进行单元测试的正确方法是什么?

0 投票
2 回答
10226 浏览

c++ - 当我#include "gmock/gmock.h" 时编译错误

我正在尝试将 googlemock 集成到我的测试中。我已经在 googletest 上成功构建并运行了测试,现在我也在尝试将 gmock 功能逐步添加到测试中,但是我遇到了一个我完全不理解的编译错误。

我没有尝试使用或定义模拟类,或使用 gmock.h 提供的任何东西。在我(以前工作的)tests.cpp 文件的顶部,我只需键入

我得到编译错误:

gmock/gmock-matchers.h(2497):错误 C2059:语法错误:'sizeof'

gmock/gmock-matchers.h(2505) : 请参阅正在编译的类模板实例化 'testing::internal::ElementsAreMatcherImpl' 的引用

gmock/gmock-matchers.h(2497):错误 C2059:语法错误:')'

gmock/gmock-matchers.h(2497):错误 C2143:语法错误:在 '{' 之前缺少 ')'

gmock/gmock-matchers.h(2497):错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持默认整数

gmock/gmock-matchers.h(2499):警告 C4183:“消息”:缺少返回类型;假定为返回“int”的成员函数

我在 Windows 7 上使用 nmake/vc++ 编译它,我无法理解为什么我会通过将核心 gmock 包含文件添加到我的测试文件中来获得这些编译错误。有没有人见过这种东西?

0 投票
5 回答
12999 浏览

c++ - 期待来自另一个线程的 googlemock 调用

使用谷歌模拟对象编写(谷歌)测试用例并期望从测试中的类控制的另一个线程调用 EXPECT_CALL() 定义的最佳方法是什么?在触发调用序列后简单地调用 sleep() 或类似方法并不合适,因为它可能会减慢不必要的测试并且可能不会真正达到计时条件。但是以某种方式完成测试用例必须等到模拟方法被调用。任何人的想法?

下面是一些代码来说明这种情况:

Bar.hpp(被测类)

Bar.cpp(摘录):

测试代码(摘录,到目前为止 FooInterfaceMock 的定义没有什么特别之处):

没有 sleep() 的测试结果:

启用 sleep() 的测试结果:

我想避免 sleep(),最好的情况是根本不需要更改 Bar 类。

0 投票
2 回答
1405 浏览

boost - Google mock 不能使用 std::vector 的 boost::variant 编译

我正在尝试为一些使用 boost::variant 的接口类创建 Google Mock 对象

当我编译它时

g++ mytest.cpp -o mytest

我明白了

/usr/include/boost/variant/detail/variant_io.hpp:64: error: no match for 'operator<<' in '((const boost::detail::variant::printer > >*)this)-> boost::detail::variant::printer > >::out_ <<operand'</p>

boost::variant 是否与 std::vector 一起使用?似乎 boost::variant 适用于我定义的任何类型,但 std:vector 除外。为什么?

升压版 - 1.45 g++ 版 - 4.4.5