By definition a unit in a unit test is the smallest testable part of an application; in our case it's a rule. Writing a unit test for every rule is expensive. It effectively doubles the cost of writing a rule. However, it is worth the effort. To minimize this cost we should focus on each rule in isolation. This includes isolating all external factors such as calls to services, repositories, and so on. Any mocking library can be used for this purpose.
Note
A mocking library can create a dummy implementation (a mock) of a service that we can use for testing the rules. The mock can record methods that have been called and return predefined values. We can verify that the correct method was executed an expected amount of times with the correct set of arguments. In the previous chapters jMock was used, but easyMock or mockito are also good alternatives.
By isolating all external factors, our unit tests will work even if they change. For example, the implementation of...