From: Barry K. <bk...@in...> - 2003-05-22 14:06:48
|
Tim Mackinnon wrote: > patient: Ouch doctor it hurts when I hit myself.... > dr: Don't do it then... > > Barry - Its a bit unclear from your example (or lack of an example) but > MockOjects require an interface. Plain and simple... I don't recall the old > version supporting this? If it did it was accidental - as we advocate > programming by interface. In our experience programming by subclassing is > typically a smell, its hard to test - and compositional programming will in > the long term give you much clearer tests that are easier to refactor and > much clearer to test. > > My advice is to convert your abstract class to an interface and proceed as > normal... The sun io classes are a classic example of how not to do it (I > figure they must be legacy code that predates them having interfaces in > java). Yes, yes, I agree of course (see one of my options for handling the situation), but making that change is not possible at this time. I'm looking for a way to quickly upgrade with minimal changes to the code (ie, I only want to change one thing a time). But 0.8 /did/ allow for the testing of an abstract class, via the use of explicit CallSequence instance variables in a non-dynamic mock class. (And you thought the use of an abstract class was smelly!). 1. subclass the abstract class: AbstractClassUnderTest 2. declare explict CallSequence instance variables 3. implement the template hook methods such that they use the CallSequence But I did come up with a quick workaround. If someone else posts a similar problem I'll describe how I did it. But first I would give the same advice as you did above. thanks! |