我有一个界面Itest:
class Itest {
bool testfunction(vector<int>& v, int& id);
}
Run Code Online (Sandbox Code Playgroud)
我可以嘲笑它:
MOCK_METHOD2(testfunction, bool(vector<int>&, int&))
Run Code Online (Sandbox Code Playgroud)
但是如何设置返回值?
我试过了:
vector<int> v;
int i;
EXPECT_CALL(testobject, testfunction(_,_, _))
.WillOnce(testing::SetArgReferee<0>(v))
.WillOnce(testing::SetArgReferee<1>(i))
.WillOnce(Return(true));
Run Code Online (Sandbox Code Playgroud)
但它被称为三次..
如何设置这些argReferees
和返回值一次?
我刚刚发现了gmock,现在正在"重新思考整个编程过程",尽可能地添加单元测试.令我感到奇怪的一点是,QSql模块明显是我们代码的外部依赖,并没有给开发人员提供模拟其内部的工具.我能用这个模块想到的最好的东西是内存数据库,它比简单的模拟更难实现,甚至不可能(考虑使用内存数据库伪装oracle包)
现在,对我来说,这不是一个问题,不久之前我们已经切换到继承自虚拟接口的本地增长的ocilib包装器(因此,很容易模拟).但是真的,当你使用Qt自己的QSql模块时,有没有办法模拟?或者更确切地说 - Qt是一个(非常好的)框架,他们真的没有为这些用例提供自动化,或者我错过了什么?
UPD1:关于问题重要性的小更新:
我的代码非常与Oracle SQL查询交错,因为对于某些其他人的代码而言.当外部依赖(也是大量开发)有时会提供不正确的数据时,单元测试这样的代码实际上是不可能的.当您的单元测试中断时,您希望它是您的代码,而不是Oracle.这就是我问原问题的原因.如果存在/存在一种使用qsqlquery接口半容易地模拟依赖关系的方法,则可以使用QSql编写代码的单元测试.
UPD2:虽然经过进一步考虑后,我不得不承认,通过更好的代码设计(OO而不是某些地方的免费功能)和更好的实体分离可以避免这个问题.因此,在UPD1中几乎不可能是不合理的.虽然这并没有真正使原始问题变得不那么重要.例如,当你负责维护遗留代码时,模拟QtSql是将测试引入系统的唯一现实方法.
我正在使用Google的测试框架Google-Mock编写关于Eigen矩阵的测试,正如另一个问题中已经讨论的那样.
使用以下代码,我能够添加一个自定义Matcher
以匹配给定精度的特征矩阵.
MATCHER_P2(EigenApproxEqual, expect, prec,
std::string(negation ? "isn't" : "is") + " approx equal to" +
::testing::PrintToString(expect) + "\nwith precision " +
::testing::PrintToString(prec)) {
return arg.isApprox(expect, prec);
}
Run Code Online (Sandbox Code Playgroud)
这样做是通过他们的isApprox
方法比较两个特征矩阵,如果它们不匹配,Google-Mock将打印相应的错误消息,其中包含矩阵的预期值和实际值.或者,它应该至少......
采取以下简单的测试用例:
TEST(EigenPrint, Simple) {
Eigen::Matrix2d A, B;
A << 0., 1., 2., 3.;
B << 0., 2., 1., 3.;
EXPECT_THAT(A, EigenApproxEqual(B, 1e-7));
}
Run Code Online (Sandbox Code Playgroud)
此测试将失败,因为A
并且B
不相等.不幸的是,相应的错误消息如下所示:
gtest_eigen_print.cpp:31: Failure
Value of: A
Expected: is approx equal to32-byte object <00-00 00-00 00-00 …
Run Code Online (Sandbox Code Playgroud) 鉴于:
#include "gmock/gmock.h"
#include <string>
using namespace testing; // tsk, tsk
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
struct Mockable {
virtual std::string ify(int x) const;
};
std::string Mockable::ify(int x) const
{
return std::to_string(x);
}
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
struct Mocked : public Mockable {
MOCK_CONST_METHOD1(ify, std::string(int)); …
Run Code Online (Sandbox Code Playgroud) 我有课
class CSumWnd : public CBaseWnd
{
private:
bool MethodA()
}
Run Code Online (Sandbox Code Playgroud)
请你能帮忙如何模拟MethodA()
而不做虚拟,我不明白hi-perf依赖注入的概念
在Mockito中,我们可以指定多个返回值(取自此处):
//you can set different behavior for consecutive method calls.
//Last stubbing (e.g: thenReturn("foo")) determines the behavior of further consecutive calls.
when(mock.someMethod("some arg"))
.thenReturn(new RuntimeException())
.thenReturn("foo");
//There is a shorter way of consecutive stubbing:
when(mock.someMethod()).thenReturn(1,2,3);
when(mock.otherMethod()).thenThrow(exc1, exc2);
Run Code Online (Sandbox Code Playgroud)
有没有办法为使用gmock制作的模拟指定多个返回?目前我有:
store_mock_ = std::make_shared<StorageMock>();
ON_CALL(*store_mock_, getFileName(_)).Return("file1").Return("file2");
Run Code Online (Sandbox Code Playgroud)
这不能编译,因为我无法弄清楚gmock中的多个返回.这可能与gmock?如果没有,还有另一种方法可以解决这个问题吗?我发现我们可以EXPECT
多次返回值,如:
using ::testing::Return;...
EXPECT_CALL(turtle, GetX())
.WillOnce(Return(100))
.WillOnce(Return(200))
.WillOnce(Return(300));
Run Code Online (Sandbox Code Playgroud)
但是,我没有找到任何模拟多个返回的文档ON_CALL
.
我有一个类,它接受一个布尔作为引用参数并返回一个整数:
class Foo
{
public:
Bar my_bar;
virtual int myMethod(bool &my_boolean) = 0;
}
/*...*/
int Foo::myMethod(bool &my_boolean){
if (my_bar == NULL){
my_boolean = false;
return -1;
}
else{
my_boolean = true;
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
我为这个类创建了一个模拟:
class MockFoo : public Foo
{
MOCK_METHOD1(myMethod,int(bool &my_boolean));
}
Run Code Online (Sandbox Code Playgroud)
我在如何设置这种函数的期望方面存在问题,因为我需要将返回值和引用参数设置为特定值以正确创建我的单元测试.如何使用gmock处理这种函数?我尝试按照我认为的文档解决方案:
using ::testing::SetArgPointee;
class MockMutator : public Mutator {
public:
MOCK_METHOD2(Mutate, void(bool mutate, int* value));
...
};
...
MockMutator mutator;
EXPECT_CALL(mutator, Mutate(true, _))
.WillOnce(SetArgPointee<1>(5));
Run Code Online (Sandbox Code Playgroud)
但要么我不明白这个例子,要么就不适用于这个案子.有没有人以前处理过这种情况?
提前致谢.
我是gmock的新手,所以我想知道如何在单元测试的测试函数中调用简单的C函数.
例:
int func(int a)
{
boolean find;
// Some code
find = func_1();
return find;
}
Run Code Online (Sandbox Code Playgroud)
我搜索过gmock,在我的理解中gmock没有提供存根简单C函数的功能,因此我想问一下gmock是否提供了mock或stub的功能func_1
?
如果不是如何func_1
在不更改源代码的情况下手动在我的测试代码中存根?我正在使用谷歌测试框架进行单元测试.
谢谢.
我在我的项目中使用gmock,我遇到了为mock函数设置自定义引用变量的问题.假设我有一个如下课程:
class XXXClient {
public:
void QueryXXX(const Request&, Response&);
};
class XXXRunner {
public:
void DoSomething(XXXClient&);
};
Run Code Online (Sandbox Code Playgroud)
使用XXXClient :: QueryXXX有一个Client Class XXXRunner :: DoSomething,我想模拟XXXClient来测试XXXRunner :: DoSomething.
问题是QueryXXX的第二个参数,即'Response',不是返回值,而是一个引用变量,我将一些数据填入XXXClient :: QueryXXX中的Response中.我想为Response设置自定义数据以验证XXXRunner :: DoSomething的不同条件.
gmock框架可以设置预期的返回值,但我找不到设置"返回变量"的方法?
那怎么办?
如何为输入参数匹配union中元素的值,例如 - 如果我使用以下符号模拟方法 -
struct SomeStruct
{
int data1;
int data2;
};
void SomeMethod(SomeStruct data);
Run Code Online (Sandbox Code Playgroud)
如何在参数中使用正确的值调用此方法的模拟?
gmock ×10
c++ ×7
googletest ×4
unit-testing ×3
c ×1
eigen ×1
googlemock ×1
mocking ×1
mockito ×1
qt ×1
reference ×1
templates ×1