I have the code below in my test code in many places:
//
// Make a function call while expecting an exception should be thrown
//
bool exceptionThrown = false;
try
{
expectNotEqual(someData, anotherData, methodName);
}
catch(std::logic_error&)
{
exceptionThrown = true;
}
if(!exceptionThrown)
throw std::logic_error(methodName+"exception not thrown");
It would be nice (more readable, concise) if I could encapsulate all that, and do something like:
exceptionShouldBeThrown(expectNotEqual(someData, anotherData, methodName));
I dont want to use macro ...does anyone know how I could achieve the one-liner above with C++?
I know you say no macro's, but why? They exist for generating code:
#define SHOULD_THROW(x, name) \
{ \
bool didThrow = false; \
try \
{ \
x; \
} \
catch(...) { didThrow = true; } \
\
if (!didThrow) \
throw std::logic_error(name " did not throw."); \
}
SHOULD_THROW(expectNotEqual(someData, anotherData), "expectNotEqual")
If you really don't want to use macros, you need to make a functor to call:
template <typename Func>
void should_throw(Func pFunc, const std::string& pName)
{
bool didThrow = false;
try
{
pFunc();
}
catch (...)
{
didThrow = true;
}
if (!didThrow)
throw std::logic_error(pName + " did not throw.");
}
Boost Bind helps here:
should_throw(boost::bind(expectNotEqual, someData, anotherData),
"expectNotEqual");
Of course anything that makes a functor works, like lambda's, etc. But if Boost is available, just use their testing library:
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
BOOST_AUTO_TEST_CASE(test)
{
BOOST_CHECK_THROW(expectNotEqual(someData, anotherData) , std::logic_error);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With