Writing meaningful tests
The common understanding of unit testing is testing the smallest possible part of software, specifically a method. In reality, we do not test methods; rather, we test a logical unit or the behavior of the system.
Logical units can extent to a single method, to an entire class, or a collaboration of multiple classes. For example, a standard calculator program can have an add method for adding two numbers. We can verify the add behavior by invoking the add
method, or we can design the calculator program to have a simple calculate API that can take two numbers and an operation (add, subtract, divide, and so on), and depending on the operand type (integer, double, and so on), the calculator may delegate the calculation to a collaborator class, such as a double calculator or a long calculator. We can still unit test the add behavior, but now multiple classes are involved. We can call this new test an integration test.
A unit test verifies an assumption about the behavior...