Smokestack follows design principles as described below:
- Modular approach (allowing to mix-and-match versions and also mock and real implementations)
- Independent of unit testing framework (although it uses JUnit for test code)
- Independent of mocking framework (although it uses JMockit for test code)
- It is clearly indicated, when functionality is incomplete (patches are welcome)
- It is clearly indicated, when mock definition is required
- Hamcrest is used for validation offering extra detail on various problems
- Mock definition is required on the "physical access edges" and the framework does not pretend to own shared resources, like databases and various other stores. What this means in practice for example for JPA, is that even if persist() was just called for an entity, the find() will only return this same object, if it is so coded in the test. While this might sound counter intuitive at first, this approach offers various benefits, like moving the control of multi-client, multi-threading testing back into the test code, a clean way to exercise exception processing in the tested code.
- The framework introduces user and system initiated states (e.g. differentiating between COMMIT and AUTOCOMMIT) allowing for fine granularity assertions of state changes.