我在一个我自己无法解决的问题上被困了一个星期。
描述: 我的老板决定用 C 语言实现 C++ 对象,因为他喜欢 GTesting 方法(不能使用 90% 的可能性,因为 C 不包含对象)。 我像聪明人在这个网站上做的那样做了:http://research.engineering.wustl.edu/~beardj/Mixed_C_C++.html
我在更大的函数中使用了它们,它工作得很好,没有任何问题,没有内存泄漏,什么都没有......通过接口(interface)完美地调用了假函数。
当我想在这个函数上应用 GTest,通过接口(interface)(双用途 header )调用这些 C++ 对象时,甚至当我想调用 GTest 时,问题就来了。
这里是源代码:
这是包含所有 GTest 和 GMock 方法的文件。这是在其他地方工作的通用文件。
InitGMock.h
#ifndef INITGMOCK_H_
#define INITGMOCK_H_
#include "GTest/gtest.h"
#include "GMock/gmock.h"
#define UNREFERENCED_PARAMETER(P) (void)(P)
using ::testing::Return;
using ::testing::Cardinality;
using ::testing::AtLeast;
using ::testing::_;
using ::testing::An;
using ::testing::A;
using ::testing::Ge;
using ::testing::Eq;
using ::testing::InSequence;
using ::testing::internal::ExpectationTester;
... and so on, using all testing methods
这是主要的 cpp 文件。
main.cpp
#include "InitGMock.h"
extern "C"
{
#include "LPAll_Testing_3.h" //all includes from C files
}
int main(int argc, char **argv)
{
testing::InitGoogleTest(&argc, argv);
::testing::TestEventListeners& listeners = ::testing::UnitTest::GetInstance()->listeners();
listeners.Append(new MemoryLeakListener);
RUN_ALL_TESTS();
getchar(); // keep console window open until Return keystroke
return 0;
}
这是我的测试
测试.cpp
#include "LPAll_Testing_3.h"
#include "InitGMock.h"
TEST(oLocalPsiTestingClass, FirstTest)
{
EXPECT_EQ(7,7);
}
我现在的想法是: 1. 有时程序没有崩溃,进行测试(但失败)。
当测试失败时,在
dbghook.c
文件中失败TEST() 被调用了两次,原因我不知道。第一个紧接在程序启动之后,第二个在
RUN_ALL_TESTS();
命令之后程序结束后出错: LP_Testing.exe 中 0x0047aae0 处的第一次机会异常:0xC0000005:访问冲突读取位置 0xcccccc1c。 未知文件:错误:测试主体中抛出代码为 0xc0000005 的 SEH 异常。
我尝试使用其他主要签名:
- int main(int argc, char **argv)//原始
- //int main(int argc, _TCHAR* argv[])
- //int _tmain(int argc, _TCHAR* argv[])
但没有人正常工作
如果有人知道如何解决这个问题,我会非常高兴,因为我开始绝望了。 :-)
谢谢,祝你有美好的一天。如果您需要一些其他信息或源代码,请询问。 :-)
编辑:
我又发现了一个奇怪的问题。
当我调用宏 EXPECT_EQ(7,7)
时,它会抛出错误 当前位置没有可用的源代码。
- VS2005 错误消息。我已经包含了 gtest.lib 和 gmock.lib(以及它们所在的目录),所以它应该看到这个命令。此外,当我想查看声明和定义时,它会将我重定向到 gtest.h
最佳答案
嗯, 我管理了一些解决方案,但它至少不稳定...
首先,我尝试添加一些“虚拟”测试:
TEST(DummyObject,FirstTest)
{
EXPECT_TRUE(TRUE);
}
然后清理并重建解决方案。 在这个过程解决方案识别出有问题的命令之后,但它仍然无法正常工作 - 大量内存泄漏,测试有时评估不正确等等。
伙计们,注意在 C++ 单元测试工具中通过 C 接口(interface)测试 C++ 对象!!! :D
关于c++ - 使用 GTest 访问违规读取位置,无需任何复杂测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23239185/