C ++ googlemock не будет компилироваться в глупом примере - PullRequest
0 голосов
/ 26 декабря 2018

Я очень плохо знаком с C ++ и пытаюсь использовать googlemock и googletest.Я не могу заставить их работать даже в простых примерах, поэтому я уверен, что должно быть что-то простое, что мне не хватает.Я был бы очень признателен за помощь в этом.У меня есть класс Foo, у которого есть другой класс Bar в качестве зависимости, поэтому я пытаюсь смоделировать эту зависимость в тестах.Извините заранее, мне кажется, что это самый простой пример внедрения зависимостей, но он все еще распространяется на 9 файлов!Это Bar:

// 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 - это просто Bar с базой, равной 0. Вот 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

Я был бы очень признателен за помощь, пожалуйста, дайте мнеЗнай, могу ли я быть более ясным!

1 Ответ

0 голосов
/ 13 мая 2019

Вы используете детали из gmock, но связываете только gtest.Вот почему InitGoogleMock () не определено.

Замена -lgtest на -lgmock должна сделать это.

Причина: gtest это тестирование фреймворка, gmock фреймворк-макет.Если вы связываете gmock, он также включает gtest, но не наоборот.

...