Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RAII and unit testing principles

The RAII (Resource Acquisition Is Initialization) is one of the suggested ways of constructing objects. How does it relate to the unit testing principles that are saying: no complex job done in the constructor? And especially no explicit creation of objects by "new" operator? However creation of some objects requires some more complex steps sometimes, and passing a factory to a constructor makes the API "dirty" in the meaning of decreasing the legibility. What are the general ways of meeting both of the principles at the same time?

I have found the other topic on SO: Stack allocated RAII objects vs DI principle, however it looks like a more general problem and it is not explained well.

like image 799
thatsme Avatar asked May 02 '14 19:05

thatsme


People also ask

What is Raii object?

The principle that objects own resources is also known as "resource acquisition is initialization," or RAII. When a resource-owning stack object goes out of scope, its destructor is automatically invoked. In this way, garbage collection in C++ is closely related to object lifetime, and is deterministic.


1 Answers

Yes, creating a concrete class in a constructor complicates the class that does so, adds a dependency to the class, and makes it harder to test.

But, RAII isn't a way of constructing objects, but of releasing resources. The class whose destructor releases the resource doesn't have to construct the object, although it usually does: see What is meant by Resource Acquisition is Initialization (RAII)?.

So, create the resource outside the class that uses it if you want, use a factory to do so if you want, etc., but then let the class that uses the resource clean it up with RAII.

like image 135
Dave Schweisguth Avatar answered Oct 21 '22 15:10

Dave Schweisguth