我有一个运行异步网络worker的系统,并定期检查worker是否存储了一些std::exception_ptr
。在这种情况下,它可能会抛出,或者以其他方式报告错误。简单的例子:
#include <exception>
#include <gmock/gmock.h>
// simplified Network interface and the mock
struct INetwork {
virtual std::exception_ptr getExceptionPtr() const = 0;
};
struct MockedNetwork: public INetwork {
public:
MOCK_METHOD(std::exception_ptr, getExceptionPtr, (), (const override));
};
// simplified system
class System {
public:
System(INetwork& network): _network{network} {}
void run() {
// some complex logic
std::exception_ptr exPtr = _network.getExceptionPtr();
if (exPtr) {
// error handling, or just rethrow
std::rethrow_exception(exPtr);
}
}
private:
INetwork& _network;
};
字符串
然后,我想测试我的代码,以下情况
每当网络通过exception_ptr报告错误时,系统应重新引发此异常
所以我有这个小的gtest测试用例:
#include <stdexcept>
#include <gtest/gtest.h>
struct MyException: public std::runtime_error {
MyException(): std::runtime_error("MyException") {}
};
TEST(Demo, demo) {
MockedNetwork mockedNet;
EXPECT_CALL(mockedNet, getExceptionPtr()).WillRepeatedly([]() -> std::exception_ptr{
return nullptr; // this is OK, but I want to simulate an error, not error-free run
// return new MyException; // this doesn't compile, and anyway seems like a bad idea
});
System sut(mockedNet);
ASSERT_THROW(sut.run(), MyException);
}
型
我如何模拟这样一种情况:我的模拟网络返回std::exception_ptr
,其中包含一个指向我的自定义异常的指针,该指针可以被重新抛出?
2条答案
按热度按时间2nbm6dog1#
std::make_exception_ptr
:字符串
qqrboqgw2#
最后,它变得非常简单。在测试设置中,您可以在
try
块中抛出异常,然后捕获它,存储std::exception_ptr
,并在gmock操作中使用它:字符串
这是可行的,但也许还有其他更好和/或更有趣的方法来实现同样的效果。