Например я хочу проверить умный указатель. И убедится что локальный объект уничтожается при выходе из своего поля видимости:
#include <stdexcept>
#include <iostream>
#include <memory>
#include "gtest/gtest.h"
class FooTest: public ::testing::Test {
public:
void SetUp() {}
void TearDown() {
std::cout << mMsg << " deleted" << std::endl;
throw std::runtime_error(mMsg);
}
void SetLog(std::string msg) {
mMsg = msg;
}
void TestBody() {}
private:
std::string mMsg;
};
// Проверяю генерится ли исключение
TEST_F(FooTest, TestExistException) {
EXPECT_ANY_THROW(
{
std::shared_ptr<FooTest> shrPtr(new FooTest());
shrPtr = std::make_shared<FooTest>();
shrPtr->SetLog("local object");
}
);
}
std::shared_ptr<FooTest> shrPtrOther(new FooTest());
// Проверяю содержание сообщения
TEST_F(FooTest, TestLogException) {
shrPtrOther = std::make_shared<FooTest>();
shrPtrOther->SetLog("other object");
try {
{ // begin scope of shrPtr
std::shared_ptr<FooTest> shrPtr(new FooTest());
shrPtr = std::make_shared<FooTest>();
shrPtr->SetLog("local object");
} // end scope of shrPtr
} catch (std::exception &e) {
EXPECT_EQ(e.what(), (std::string )"local object");
}
}
В консоли получаю:
Running main() from gtest_main.cc
[==========] Running 2 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 2 tests from FooTest
[ RUN ] FooTest.TestExistException
../src/testDel.cpp:44: Failure
Expected: { std::shared_ptr<FooTest> shrPtr(new FooTest()); shrPtr = std::make_shared<FooTest>(); shrPtr->SetLog("local object"); } throws an exception.
Actual: it doesn't.
deleted
unknown file: Failure
C++ exception with description "" thrown in TearDown().
[ FAILED ] FooTest.TestExistException (18 ms)
[ RUN ] FooTest.TestLogException
deleted
unknown file: Failure
C++ exception with description "" thrown in TearDown().
[ FAILED ] FooTest.TestLogException (0 ms)
[----------] 2 tests from FooTest (152 ms total)
[----------] Global test environment tear-down
[==========] 2 tests from 1 test case ran. (154 ms total)
[ PASSED ] 0 tests.
[ FAILED ] 2 tests, listed below:
[ FAILED ] FooTest.TestExistException
[ FAILED ] FooTest.TestLogException
2 FAILED TESTS
Основной вопрос заключается в том, как обработать исключения из TearDown() ("деструктора"), с целью автоматизировать проверку возникающих сообщений.
Вы не правильно используете fixture. Их смысл в том, чтобы подготавливать / подчищать данные для теста избегая тем самым копипасты в каждом тесте. Самостоятельно создавать экземпляры таких классов не следует. Метод TearDown предназначен для потенциально кидающей исключения подчистки тестовых данных, чтобы избежать исключений в деструкторе. В этом методе не следует продолжать сам тест, или, тем более, специально кидать исключения.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники