エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

その6:アサーションの解説(3)

例外を扱うアサーションマクロです。

Fatal assertionNonfatal assertionVerifies
ASSERT_THROW(statement, exception_type) EXPECT_THROW(statement, exception_type) statement throws an exception of the given type
ASSERT_ANY_THROW(statement) EXPECT_ANY_THROW(statement) statement throws an exception of any type
ASSERT_NO_THROW(statement) EXPECT_NO_THROW(statement) statement doesn't throw any exception
ASSERT_THROW

ASSERT_THROWマクロは、指定した例外が送出されることを検証します。
第2引数に送出されるはずの例外の型を指定します。例外のオブジェクトではなく、例外の型であることに注意してください。

void throwRuntimeError()
{
    throw std::runtime_error("error");
}

TEST(ExceptTest, Test1)
{
    ASSERT_THROW(throwRuntimeError(), std::runtime_error);
}


第2引数には、送出される例外の基底クラスを指定してもかまいません。

TEST(ExceptTest, Test2)
{
    ASSERT_THROW(throwRuntimeError(), std::exception);
}
ASSERT_ANY_THROW

ASSERT_ANY_THROWマクロは、任意の例外の送出を検証します。

TEST(ExceptTest, Test4)
{
    ASSERT_ANY_THROW(throwRuntimeError());
}
ASSERT_NO_THROW

ASSERT_NO_THROWマクロは、例外が送出されないことを検証します。

TEST(ExceptTest, Test5)
{
    ASSERT_NO_THROW(throwRuntimeError());
}

例外を扱うアサーションマクロの第1引数

アサーションマクロの一覧を見ると第1引数がstatementになっています。つまり文を記述することができます。

TEST(ExceptTest, Test6)
{
    ASSERT_NO_THROW({
        std::cout << "foo" << std::endl;
        std::cout << "bar" << std::endl;
        std::cout << "baz" << std::endl;
    });
}