Expensive Set Up Smell

As in the "setUp()" of JavaUnit.

From KentBeck on the XpMailingList:

"Reflect on your design practices. I have spent 8 years figuring out how to further decouple my objects to make them easier to test. Expensive setUp() is a design smell."


Unnecessary coupling is bad, of course. But testing real code instead of mocked code often requires extensive setup. This is not a smell unless the code is a blob. Getting around the setup by mocking means you aren't testing what needs to be tested. That is not just a smell; it's a stink.

Well, there's a trade-off, certainly. In my own experience I find that if I don't mock out some of what could be mocked out, I just write fewer tests, which exposes you to risk, too. Possibly other programmers might be more disciplined, but if I'm testing a command that commits to the database, writes to a log file, and sends out 25 emails, I'm going to test just that if I can have all the external services mocked out.

You can test those non-mocked services, too. But in my experience it makes things easier to test them in their own test case classes, as opposed to implicitly through its clients. -- francis


The other smell comes when you DON'T mock.

To write feature A, you first write test A'.

To add feature B to A, you write test B' that calls the same setUp as A'.

To add feature C to B, you write test C' that calls the same setUp as B'.

You have now coupled A to C!


EditText of this page (last edited June 28, 2011) or FindPage with title or text search