- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我开始将 CppUTest 用于某些 C/C++ 项目。尤其是模拟扩展听起来不错,但我目前正在努力如何以正确的方式设置模拟。假设一个用于抽象网络套接字通信的低级类。
我的第一种方法:
size_t CMockSocket::recv(void* buf, size_t len){ return (size_t) mock().actualCall("recv") .withParameter("len", (int) len) .returnValue().getIntValue();}
设置期望:
mock().expectOneCall("recv") .withParameter("len", 20) .andReturnValue(15);
到目前为止一切顺利。但我需要的是提供更多数据——在本例中,我想通过 buf 指针返回 15 个字节。我尝试使用 .setData()
和 setDataObject()
方法。但看起来函数将数据存储在命名变量中,而不是预期的函数调用。因此后续调用将覆盖前面的数据,对吧?
我当前的问题是如何将额外的返回 数据传递给模拟方法?我的第一个方法是创建一个包含返回值 (size_t) 和数据缓冲区的结果类。像这样:
class CRecvResults{public: size_t m_returnValue; void* m_buffer; CRecvResults(size_t returnValue, void* buffer) : m_returnValue(returnValue), m_buffer(buffer) {} ~CRecvResults() {}};size_t CMockSocket::recv(void* buf, size_t len){ CRecvResults* pResults = (CRecvResults*) mock().actualCall("recv") .withParameter("len", (int) len) .returnValue().getPointerValue()); assert(pResults != NULL); assert(buf != NULL); assert(len >= pResults->m_buffer.length()); memcpy(buf, pResults->m_buffer.data(), pResults->m_buffer.length()); return pResults->m_returnValue;}
和期望:
char* buffer = "some returning buffer content at least 15 chars long";CRecvResults results(15, buffer);mock().expectOneCall("recv") .withParameter("len", 20) .andReturnValue(&results);
问题:这是正确的方法还是我错过了什么?我需要缓冲区内容,因为我需要测试结果解释器。
我的第二种方法:
bool CMockSocket::send(const void* buf, size_t len){ return mock().actualCall("send") .withParameter("len", (int) len) .returnValue().getIntValue();}
设置期望:
mock().expectOneCall("send") .withParameter("len", 20) .andReturnValue(true);
在这种情况下,我想验证 buf 中由被测代码生成的传出数据。因此,我需要将该缓冲区内容(和长度)返回给测试函数。像这样:
class CSendResults{public: bool m_returnValue; char* m_buffer; size_t m_length; CSendResults(bool returnValue, char* buffer, size_t length) : m_returnValue(returnValue), m_buffer(buffer), m_length(length) {} ~CSendResults() {}};bool CMockSocket::send(const void* buf, size_t len){ CSendResults* pResults = (CSendResults*) mock().actualCall("send") .returnValue().getPointerValue(); assert(pResults != NULL); assert(buf != NULL); assert(pResults->m_length >= len); memcpy(pResults->m_buffer, buf, len); pResults->m_length = len; return pResults->m_returnValue;}
和期望:
char buffer[1024];CSendResults results(true, buffer, sizeof(buffer);mock().expectOneCall("send") .withParameter("len", 20) .andReturnValue(&results);// further checks for results content...
这看起来非常难看,而且对我来说开销很大。我的问题又来了:这是正确的方法还是我错过了什么?
我的最后一个问题:我的测试方法会不会是完全错误的?请告诉我您的经验和做法!
最佳答案
CppUTest 中添加了一项新功能,可让您为模拟指定输出参数。它可能是这样的:
{
return (size_t) mock().actualCall("recv")
.withOutputParameter("buf", buf)
.withParameter("len", (int) len)
.returnUnsignedLongIntValueOrDefault(0);
}
期望可以这样指定:
char buffer[] = "blabla";
mock().expectOneCall("recv")
.withOutputParameterReturning("buf", buffer, sizeof(buffer))
.withParameter("len", sizeof(buffer))
.andReturnValue(sizeof(buffer));
buffer
的内容将通过输出参数复制到 mock 的调用者。因此不再需要丑陋的解决方法。
关于CppUTest:如何将更多数据传递给特定的模拟调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15243838/
我正在尝试重写一些遗留的 C 代码,并希望在实际开始重写之前进行一些测试。为此,我查看了 CppUTest 并尝试了一个示例应用程序,该示例应用程序包含一个头文件 chrtostr.h、一个实现文件
我开始将 CppUTest 用于某些 C/C++ 项目。尤其是模拟扩展听起来不错,但我目前正在努力如何以正确的方式设置模拟。假设一个用于抽象网络套接字通信的低级类。 我的第一种方法: size_t C
我是 mac 新手!我下载了 xcode4.2 并尝试构建 CppUTest-v3 1)当我做的时候,我有以下日志 compiling AllTests.cpp compiling Allocatio
我写了语法:mock().expectNoCall("productionCode") 正如 Cpputest.org 页面所说。但是编译器说 mocksupport 类不支持这种类型的顺序。 tes
我将尝试将此作为一个纯粹的最小示例,以尽可能适用于更多人,并保护可能违反 NDA 的任何类型的代码共享。希望一切都好! 我正在使用 CppUTest 和 CppUMock(使用 gcc/g++ 编译并
我开始在一些 C 嵌入式项目中使用 CppUTest。现在我正在处理对系统的模拟调用。在学习了如何传递 C 典型类型之后,例如: 正常工作的示例: 代码的模拟文件部分: uint32_t LL_TIM
有什么方法可以模拟静态全局变量以在测试函数中使用?或者有什么解决方法吗? 下面是这种情况的示例: static zsock_t *publish_logs = NULL; int btak_log_
我有以下方法: QMap DefaultConfig::getConfig() { QMap result; result.insert("Error", LOG_LOCAL0);
我正在学习 TDD 并在 Eclipse 中使用 CppUTest。有什么方法可以调试我的代码出现烦人的段错误。 谢谢 最佳答案 我不知道 CppUTest 或 Eclipse 中有什么特别的东西可以
我在尝试使用 CPPUTest 测试我的库时遇到问题。 一切都很好,直到我包含 Eigen 库来处理矩阵处理。当我尝试使用 g++ 构建时,Eigen 库不断抛出错误: /eigen3/Eigen/s
我在不在目标硬件上运行的情况下对嵌入式 C 代码进行单元测试。这是代码的一部分: uint8 tempReadback = 0; write_to_i2c( msg->addres, msg->val
我在使用 cppunit 测试我的应用程序时收到此错误消息 Allocation/deallocation type mismatch allocated at file: line: 0 size
我在 eclipse-cdt(ubuntu 14.0) 中使用 CppUTest。对于 CppUTest 中 C 函数的继承,我应该这样写: extern "C" { } 是否有任何替代方案可以将所有
我认为这是一个简单的问题...我希望变量 virtualLeds 在测试组 LedDriverTests 中的所有测试之间共享,这是代码: #include "CppUTest/TestHarness
我用CMake做了一个库,然后做了一个测试exe。构建后,我想自动运行我的测试用例。这是我的 CMakeLists.txt。它使 .exe 正常但不运行它。我正在使用 Linux。 cmake_min
我正在尝试使用 mingw-w64 编译 cpputest,但无法使其工作,而且我找不到有关如何执行此操作的任何资源。所以希望这个问题将来能帮助其他人。 我想使用 mingw-w64 编译 cpput
我使用的是 Atmel Studio 6.1.2 SP2。我正在为我们的嵌入式系统项目设置 CppUTest。我为 CppUTest 框架创建了一个静态 CPP 库,在稍作改动后成功编译。现在我将这个
是否有可能,如果可能如何,用测试框架控制下的定义替换某个定义? 例如,假设嵌入式系统使用定义来访问端口,如下所示: #define PORTA_CONFIG (*(volatile unsigned
在Ubuntu下安装了g++ 4.9.0(实验)版本(我正在使用该版本提供的某些功能) 构建代码时,我使用脚本中的 cmake,并且它可以正确构建。下面的gcc包含g++的安装路径(/mnt...)
我正在开始学习嵌入式C的测试驱动开发,并开始阅读《嵌入式C的测试驱动开发》一书,其中他们推荐了两种开发系统测试环境:Unity和CppUTest。 因此,我决定下载两者的代码,并且下载并安装 Cygw
我是一名优秀的程序员,十分优秀!