Могу ли я использовать фиктивные объекты Googlemock в модульных тестах с помощью C++Builder?

Googlemock может помочь в создании фиктивных классов, с помощью которых можно определить, вызывает ли один метод другой метод и с какими параметрами, а также влиять на поведение вызываемого метода.

Например, для проверки этого метода a() в классе UnderTest на самом деле вызывается метод b().

class UnderTest {
public:
  /// Method a() calls method b().
  virtual void a() {b();}
  /// Method b() does nothing.
  virtual void b() {}
};

можно написать фиктивный класс, который перезаписывает метод b()

class UnderTestMock : public UnderTest {
public:
  MOCK_METHOD0(b, void());
};

и проверьте, действительно ли метод b() вызывается после вызова метода a():

TEST(UnderTest, aCallsB) {
  UnderTestMock mock;
  EXPECT_CALL(mock, b());
  mock.a();
}

Могу ли я использовать Googlemock таким образом с C++Builder 11.2?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нет, на данный момент невозможно использовать Googlemock таким образом с C++Builder 11.2.

Сам проект Googletest (который включает Googlemock) удалил всю поддержку C++Builder в 2019 году . С тех пор Embarcadero опубликовала свою собственную исправленную версию Googletest в пакете GetIt, который включает в себя файлы проекта для сборки Googletest и Googlemock и некоторые примеры использования.

Все файлы проекта, связанные с Googlemock, несколько повреждены, например. файл gmock.cbproj вставляет исходный файл в библиотеку gmock.a, которая выполняет некоторые несвязанные тесты в Googletest. Все эти ошибки файлов проекта можно легко исправить, удалив исходные файлы из проектов, которые им не принадлежат, и перестроив их.

Однако после исправления файла проекта gmock.cbproj оказалось, что основная фича Googlemock — макрос EXPECT_CALL() — не поддерживается C++Builder 11.2:

Это простой исходный файл, который объединяет фрагменты кода из вопроса, добавляет основную функцию и включает в себя:

#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include <tchar.h>

int _tmain(int argc, _TCHAR* argv[])
{
  testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}

class UnderTest {
public:
  /// Method a() calls method b().
  virtual void a() {b();}
  /// Method b() does nothing.
  virtual void b() {}
};

class UnderTestMock : public UnderTest {
public:
  MOCK_METHOD0(b, void());
};

TEST(UnderTest, aCallsB) {
  UnderTestMock mock;
  EXPECT_CALL(mock, b());
  mock.a();
}

Этот пример отлично работает с Googlemock с другими компиляторами (максимум tchar, _tmain нужно заменить на char, main), однако с C++Builder некоторые необходимые функции отсутствуют либо в компиляторе, либо в стандартной библиотеке C++. Сообщение об ошибке при компиляции с помощью 64-битного компилятора C++Builder на основе clang:

Build FAILED.

C:\Users\...\Documents\Embarcadero\Studio\22.0\CatalogRepository\GoogleTest-2021.09\googlemock\include\gmock/gmock-nice-strict.h(134,6): C++ warning : __declspec attribute 'empty_bases' is not supported
C:\Users\...\Documents\Embarcadero\Studio\22.0\CatalogRepository\GoogleTest-2021.09\googlemock\include\gmock/gmock-nice-strict.h(174,6): C++ warning : __declspec attribute 'empty_bases' is not supported
C:\Users\...\Documents\Embarcadero\Studio\22.0\CatalogRepository\GoogleTest-2021.09\googlemock\include\gmock/gmock-nice-strict.h(215,6): C++ warning : __declspec attribute 'empty_bases' is not supported
c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64\type_traits(2686,1): C++ error : no matching function for call to 'invoke'
c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64\functional(216,10): C++ error : > in instantiation of function template specialization 'std::_Invoke_ret<void, testing::internal::DoDefaultAction &>' requested here
c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64\functional(165,2): C++ error : > in instantiation of member function 'std::_Func_impl<testing::internal::DoDefaultAction, std::allocator<int>, void>::_Do_call' requested here
c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64\xmemory0(704,23): C++ error : > in instantiation of function template specialization 'std::_Func_impl<testing::internal::DoDefaultAction, std::allocator<int>, void>::_Func_impl<testing::internal::DoDefaultAction, const std::allocator<int> &>' requested here
c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64\xmemory0(845,6): C++ error : > in instantiation of function template specialization 'std::allocator<std::_Func_impl<testing::internal::DoDefaultAction, std::allocator<int>, void> >::construct<std::_Func_impl<testing::internal::DoDefaultAction, std::allocator<int>, void>, testing::internal::DoDefaultAction, const std::allocator<int> &>' requested here
c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64\xmemory0(994,13): C++ error : > in instantiation of function template specialization 'std::allocator_traits<std::allocator<std::_Func_impl<testing::internal::DoDefaultAction, std::allocator<int>, void> > >::construct<std::_Func_impl<testing::internal::DoDefaultAction, std::allocator<int>, void>, testing::internal::DoDefaultAction, const std::allocator<int> &>' requested here
c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64\functional(376,6): C++ error : > (skipping 6 contexts in backtrace; use -ftemplate-backtrace-limit=0 to see all)
C:\Users\...\Documents\Embarcadero\Studio\22.0\CatalogRepository\GoogleTest-2021.09\googlemock\include\gmock/gmock-actions.h(470,4): C++ error : > in instantiation of function template specialization 'testing::Action<void ()>::Init<testing::internal::DoDefaultAction>' requested here
C:\Users\...\Documents\Embarcadero\Studio\22.0\CatalogRepository\GoogleTest-2021.09\googlemock\include\gmock/gmock-spec-builders.h(909,8): C++ error : > in instantiation of function template specialization 'testing::Action<void ()>::Action<testing::internal::DoDefaultAction, void>' requested here
C:\Users\...\Documents\Embarcadero\Studio\22.0\CatalogRepository\GoogleTest-2021.09\googlemock\include\gmock/gmock-spec-builders.h(1629,12): C++ error : > in instantiation of member function 'testing::internal::TypedExpectation<void ()>::TypedExpectation' requested here
C:\Users\...\Documents\Embarcadero\Studio\22.0\CatalogRepository\GoogleTest-2021.09\googlemock\include\gmock/gmock-spec-builders.h(1284,29): C++ error : > in instantiation of member function 'testing::internal::FunctionMocker<void ()>::AddNewExpectation' requested here
C:\Users\...\Documents\Embarcadero\Studio\Projects\gmocktest\main.cpp(26,2): C++ error : > in instantiation of member function 'testing::internal::MockSpec<void ()>::InternalExpectedAt' requested here
c:\program files (x86)\embarcadero\studio\22.0\include\dinkumware64\type_traits(2664,6): C++ error : > candidate template ignored: substitution failure [with _Callable = testing::internal::DoDefaultAction &, _Types = <>]: no matching function for call to '_Call'
    3 Warning(s)
    13 Error(s)

Два примера проектов, включенных в пакет GetIt для Googlemock, намекают на то, что некоторые изолированные аспекты Googlemock могут работать, например, по крайней мере один сопоставитель Googlemock работает внутри макроса EXPECT_THAT(), но ни один из примеров, скомпилированных пакетом GetIt, не использует главная особенность Googlemock, макрос EXPECT_CALL().

Вы подали это как отчет об ошибке на портале качества Embarcadero?

Roger Cigol 02.10.2022 20:45

@RogerCigol Да.

T. Herzke 05.10.2022 15:39

Другие вопросы по теме