问题标签 [hippomocks]

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 回答
1160 浏览

c++ - HippoMocks:是否可以模拟非虚拟方法?

我开始使用 HippoMocks 来编写单元测试。我想知道是否可以模拟非虚拟类方法?

乍一看代码似乎表明该框架仅支持虚拟方法。但由于它支持模拟简单的 C 函数,因此应该可以对非虚拟类方法执行相同的操作。

有没有办法做到这一点?

0 投票
1 回答
1129 浏览

c++ - Hippomocks - 具有可变参数计数的模拟函数

Hippomocks有 OnCallFuncOverload 宏,用于模拟重载函数调用。我正在尝试使用可变数量的 args 来模拟函数。任何人都可以举一个变量计数的重载函数的例子吗?

我的代码

我正在尝试这段代码

编译器输出:

0 投票
0 回答
245 浏览

c++ - Hippomocks 可以在不同的源文件中为同一个 MockRepository 设置期望吗?

我希望多个文件中的多个测试能够从另一个文件调用单独编译的实用程序方法,该方法为每个测试设置相同的期望。但是,Hippomocks 在为不同源文件中的同一个 MockRepository 设置期望时似乎存在问题。

这是一个简单的例子:

file1.cpp 是:

file2.cpp 是:

如果我交换行 A 和 B,Method45 调用现在返回 9999。事实证明,当进行 Method45 调用时,搜索匹配期望会在 file2 中找到第一个模拟函数,然后再从 file1 中找到正确的模拟函数。

MockRepository 中有 4 种模拟方法,但 Hippomocks 会funcIndex在每个源文件的基础上分配一个值,因为它使用__COUNTER__预处理器变量(在每个源文件中从 0 开始,每次在该文件中使用时递增 1)源文件)在对 RegisterExpect 的调用中。因此,单独的源文件中的每个后续期望设置“隐藏”了使用该索引设置的所有先前期望。

似乎我需要将所有将期望设置到每个单独编译的源文件中的实用程序函数作为内联代码包含在内,这不是一个很好的解决方案。有没有其他方法可以做到这一点?

0 投票
3 回答
2631 浏览

c++ - HippoMocks - 在“NeverCallFunc”之后对同一函数使用“ExpectCallFunc”会导致意外的“HippoMocks::ExpectationException”

想象一下,我们有一个单元测试,它首先执行一个我们希望函数someFunc不会被调用的代码序列,然后执行一个我们希望该函数只被调用一次的代码序列。使用HippoMocks,我们可以这样写:

但是,在 Windows 上运行上述代码片段(使用 Cygwin 工具链编译)时,HippoMocks::ExpectationException会抛出 a:

所以我想知道...

... (1),如果 HippoMocks 不是为处理这种情况而设计的。期望someFunc被调用(第 33 行)不会取代相应模拟存储库中的先前期望吗?

...(2),为什么没有满足第二个期望(第 33 行),因为someFunc明确地被调用了。如果有的话,我会期望第一个期望(第 27 行)没有得到满足?

有趣的是,事情正好相反。以下代码段运行没有任何问题:

此外,如果someFunc在第二个片段中的第二个期望后面插入了对的调用(如注释中所示),这将被检测到并报告为违反 HippoMocks 的“从不调用”期望,正如人们所期望的那样:

HippoMocks 专家的任何帮助将不胜感激......

0 投票
1 回答
171 浏览

multithreading - HippoMocks 是线程安全的吗?

HippoMocks 是否可以像这样在并发测试用例中使用:

  1. 同步启动阶段

    • 创建模拟
    • 登记期望等
  2. 并行测试阶段

    • 在模拟上调用方法
  3. 同步拆卸阶段

    • 验证模拟

我没有找到关于这个问题的明确声明。这里和那里提到,模拟非虚拟方法会破坏线程安全的可能性(HippoMocks:是否可以模拟非虚拟方法?)或者可以很容易地添加线程安全(不幸的是没有实际揭示如何)。GoogleMock 非常清楚地回答了这个问题(https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md#using-google-mock-and-threads),这样的信息在这里会有所帮助,也。

0 投票
1 回答
525 浏览

c++ - 未指定期望时,HippoMocks 抛出 NotImplementedException

我正在研究使用模拟进行单元测试,我正在添加到现有代码中。为此,我正在使用HippoMocks。这涉及另一个类调用我的模拟上的一些方法(都是虚拟的)。NotImplementedException我想避免过度指定所有这些,但是每当其他类在我的模拟上调用我没有指定的函数时,HippoMocks 就会继续抛出。

下面的代码暴露了我的问题。

有没有办法告诉 HippoMocks 不要在这里失败?我只想为特定测试指定我关心的事物的期望,而不是每个被调用的事物。

PS:对于那些有嘲笑经验的人,我认为这一切都错了吗?在这种情况下过度指定测试不是问题/“你想要什么”?

0 投票
1 回答
531 浏览

c++11 - C++11 中带有 HippoMocks 成员的 gtest 派生类的编译错误更宽松的抛出说明符

在使用 C++11 编译来自 testing::Test of google test 的测试用例时,我遇到了错误。如果我的派生类具有 HippoMock::MockRepository 成员,将引发以下错误。

虚拟 MyTestClass::~MyTestClass noexcept(false) 错误覆盖 'virtual testing::Test::~Test() noexcept(true)' 的更宽松的抛出说明符

由于 HippoMock::MockRespository 析构函数抛出异常并定义为 noexcept(false) ,因此报告此错误,但是谷歌测试析构函数定义为 'virtual testing::Test::~Test()'

解析度:

  1. 将所有派生的析构函数标记为 noexcept(false)。然而,这是不可行的,并且可能导致崩溃,因为 HippoMock::MockRepository 从析构函数中抛出异常。
  2. 声明 google test testing::Test::~Test() noexcept(false)。但是我真的不知道后果,还有我们使用谷歌模拟的新代码。

请注意,由于遗留代码包含大量 HippoMocks 代码,因此用 Google Mock 替换所有代码是不可行的。更新的代码也使用谷歌模拟。

我只想知道,定义 gtest testing::Test::~Test() noexcept(false) 有什么后果?

0 投票
1 回答
906 浏览

c++ - HippoMocks:如何使用通过引用传递的参数进行 ExpectCall?

在使用 Hippomocks 时,我们很难期望将 byref 参数传递给函数。

IBar 是一个接口。

然后我有一个函数调用:

这是测试:

运行测试会给我以下错误:

非常感谢!

0 投票
1 回答
193 浏览

c++ - 部分类模拟

我想使用 hippomock 来模拟类中的方法。该方法由同一类中的另一个方法调用。如...

测试模拟类()...

在抛出 'HippoMocks::NotImplementedException' 的实例后调用终止 what(): 函数调用没有预期!

知道为什么我不能模拟这样的方法吗?

http://hippomocks.com/Main_Page上的示例看起来与我的几乎相同,所以我认为应该支持?

谢谢,G

0 投票
1 回答
172 浏览

c++ - Hippomocks:属性是值而不是指针

我是 Hippomocks 和 C++ 的新手。我尝试编写一个捕获异常的单元测试。为此,我编写了以下测试:

test()工作正常,这是我在https://app.assembla.com/wiki/show/hippomocks/Tutorial_3_0上找到的一个示例。

但是,如果我运行test_a()没有抛出异常,我会得到以下信息:

我看到 Foo1 和 Foo2 之间的区别在于,在 Foo1 中,属性栏是一个指针,而在 Foo2 中,它是值。我的问题是:

  1. 为什么会有不同的行为?或者更确切地说,为什么没有抛出异常,因为我 memcpy(&g->bar, b, sizeof(*b))为模拟对象 b 设置了?
  2. 如何在不更改课程的情况下修复它?

谢谢你的时间!