c++ - C++ googlemock 不会在愚蠢的例子中编译
问题描述
我对 C++ 很陌生,我正在尝试使用 googlemock 和 googletest。即使在简单的示例中,我似乎也无法让它们工作,所以我确信一定有一些简单的东西我错过了。我真的很感激这方面的一些帮助。我有一个类 Foo 它有另一个类 Bar 作为依赖项,所以我试图在测试中模拟这个依赖项。对不起,这对我来说似乎是最简单的依赖注入示例,但它仍然分布在 9 个文件中!这是酒吧:
// lib/bar.h
#ifndef BAR_H
#define BAR_H
class Bar {
public:
Bar(int baz);
virtual ~Bar() {};
int _baz;
};
#endif
通过实施:
// lib/bar.cpp
#include "bar.h"
Bar::Bar(int baz) : _baz(baz) {}
这是 MockBar 标头:
// tests/mock_bar.h
#ifndef MOCK_BAR_H
#define MOCK_BAR_H
#include <gmock/gmock.h>
#include "../lib/bar.h"
class MockBar : public Bar {
public:
MockBar();
virtual ~MockBar() {};
};
#endif
和实施:
// tests/mock_bar.cpp
#include "mock_bar.h"
MockBar::MockBar() : Bar(0) {
}
所以 MockBar 只是将 baz 设置为 0 的 Bar。这里是 Foo:
// lib/foo.h
#ifndef FOO_H
#define FOO_H
#include "bar.h"
class Foo {
public:
Foo(Bar bar);
virtual ~Foo() {};
Bar _bar;
int getBaz();
};
#endif
// lib/foo.cpp
#include "foo.h"
Foo::Foo(Bar bar) : _bar(bar) {
}
int Foo::getBaz() {
return _bar._baz;
}
这是我的测试:
// tests/test_foo.h
#ifndef TEST_FOO_H
#define TEST_FOO_H
#include <gtest/gtest.h>
#include "../lib/foo.h"
#include "mock_bar.h"
class FooTest : public ::testing::Test {
public:
FooTest();
Foo subject;
MockBar mock_bar;
virtual ~FooTest() {};
};
#endif
// tests/test_foo.cpp
#include "test_foo.h"
FooTest::FooTest() : mock_bar(), subject(mock_bar) {
}
TEST_F(FooTest, BazTest)
{
ASSERT_TRUE(subject.getBaz() == 0);
}
最后,主要的测试功能是:
// tests/main.cpp
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include "test_foo.h"
int main(int argc, char **argv) {
testing::InitGoogleMock(&argc, argv);
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
当我将这一切与以下内容一起编译时:
g++ tests/main.cpp tests/test_*.cpp tests/mock_*.cpp lib/*.cpp -o test
-lgtest -lpthread -std=c++11
我得到错误:
Undefined symbols for architecture x86_64:
"testing::InitGoogleMock(int*, char**)", referenced from:
_main in main-0b53fe.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1
我真的很感激一些帮助,如果我能更清楚,请告诉我!
解决方案
您正在使用 gmock 的部件,但仅链接 gtest。这就是 InitGoogleMock() 未定义的原因。
用 -lgmock 替换-lgtest应该可以。
原因:gtest 是测试框架,gmock 是模拟框架。如果您链接 gmock,它还包括 gtest,但反之则不然。
推荐阅读
- node.js - Mysql pool.query() 性能缓慢
- android - 为什么应用内更新失败并显示 resultCode 0?
- javascript - 自动刷新 Java Script 中的一些 PHP 代码
- asp.net - 如何使用 ASP.NET Core 2.1 Identity 在单个事务中添加新用户和声明?
- java - Hazelcast 锁 - 实例死亡
- python - 将 current_user 从 Flask-Login 传递到 Plotly Dash 应用程序
- python - 在 django 中以表单形式获取所需 BooleanField 的简单方法
- c++ - 如何在 Shogun 中保存/加载训练有素的模型?
- c# - 如何修剪两个已知值之间的字符串并删除任何类型的空格的所有运行并用单个空格替换它们
- rest - 管理运行 azure devops 管道的权限和务实地更改变量组的权限