gpt4 book ai didi

c++ - Gtest 新关键字

转载 作者:行者123 更新时间:2023-12-05 05:47:44 27 4
gpt4 key购买 nike

如果内存不足,C++ 中的

new 关键字将抛出异常,但下面的代码会在 new 失败时尝试返回“NO_MEMORY”。这很糟糕,因为它会引发 std::bad_alloc 异常。

我正在写一个单元测试(gtest)。如何创建一个场景来解决这个问题。

class base{


public: base(){
std::cout<<"base\n";
}
};


std::string getInstance(base** obj){

base *bObject = new base();
*obj = bObject; //updated
return (NULL == bObject) ? "NO_MEMORY" : "SUCCESS"; // here is problem if new fail it raise an exception. How to write unit test to catch this?
}

int main()
{

base *base_obj;
getInstance(&base_obj);
}

最佳答案

您是否调查过EXPECT_THROW

如果您不能完全更改您的代码(如果您想使用 gmock,则这是必需的),您可以按照其他答案的建议全局重载 new 运算符。

但是,您应该谨慎地执行此操作,因为其他函数(包括 google test 中的函数)会使用此运算符。

实现此目的的一种方法是使用全局变量,使 new 运算符有条件地抛出。请注意,这不是最安全的方法,特别是当您的程序使用多线程时

下面是使用此方法和全局变量 g_testing 测试您描述的场景的一种方法。

// https://stackoverflow.com/questions/70925635/gtest-on-new-keyword

#include "gtest/gtest.h"

// Global variable that indicates we are testing. In this case the global new
// operator throws.
bool g_testing = false;

// Overloading Global new operator
void *operator new(size_t sz) {
void *m = malloc(sz);
if (g_testing) {
throw std::bad_alloc();
}

return m;
}

class base {
public:
base() { std::cout << "base\n"; }
};

std::string getInstance(base **obj) {
base *bObject = new base();
*obj = bObject; // updated
return (NULL == bObject)
? "NO_MEMORY"
: "SUCCESS"; // here is problem if new fail it raise an exception.
// How to write unit test to catch this?
}

TEST(Test_New, Failure) {
base *base_obj;

// Simple usage of EXPECT_THROW. This one should THROW.
g_testing = true;
EXPECT_THROW(getInstance(&base_obj), std::bad_alloc);
g_testing = false;

std::string result1;
// You can put a block of code in it:
g_testing = true;
EXPECT_THROW({ result1 = getInstance(&base_obj); }, std::bad_alloc);
g_testing = false;
EXPECT_NE(result1, "SUCCESS");
}

TEST(Test_New, Success) {
base *base_obj;

std::string result2;
// This one should NOT throw an exception.
EXPECT_NO_THROW({ result2 = getInstance(&base_obj); });
EXPECT_EQ(result2, "SUCCESS");
}

这是您的工作示例:https://godbolt.org/z/xffEoW9Kd

关于c++ - Gtest 新关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70925635/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com