In many application I often have algorithms which make use of dedicated sub-algorithms (or simply well defined pieces of code).
Till now, when I wrote the main algorithm, i created a private method for each sub-algorithm like in the example below (OldStyle):
public class OldStyle {
public int mainAlg() {
int x = subAlg01();
int y = subAlg02();
int z = x * y;
return z;
}
private int subAlg01() {
return 3;
}
private int subAlg02() {
return 5;
}
}
This worked fine but I didn’t like having a proliferation of methods (subAlg01 and subAlg02) which, even if private, were only used by one method (mainAlg).
Recently I dicovered the use of local inner classes and now my example is (NewStyle):
public class NewStyle {
public int mainAlg() {
class Nested {
public int subAlg01() {
return 3;
}
public int subAlg02() {
return 5;
}
}
Nested n = new Nested();
int x = n.subAlg01();
int y = n.subAlg02();
int z = x * y;
return z;
}
}
I like it very much but now I have the following problem: how do I test subAlg01 and subAlg02 using JUnit?
By the way: I’m using eclipse.
Thanks for you help.
Edit: I try to explain better: I have, let’s say, a sorting algorithm and I want to test it to be sure it runs as expected. This sorting algorithms is used by only method m of class X. I could make it a private method of class X but class X usually has nothing to do with sorting, so why “spoil” class X with the sorting method? So I put it inside method m. Some time later I want to improve my sorting algorithm (I make it faster) but I want to be sure that it’s behavior is as expected, so I want to re-test it with the original tests.
That’s what I want to do, maybe there is no solution, I hope someone may help me.
Edit after answer choice. I selected Rodney answer because his solution is the one I adopted: a standalone helper class helps me (it’s a helper!) to have a clear view of what are the sub methods and it also gives me the ability to test them.
Filippo, I understand your frustration with the problem and with some of the answers. When I first started using JUnit many years ago, I too wanted to test private code, and I thought it silly of the gurus to say it was a bad idea.
Turns out they were right (surprise!) but only after writing quite a few tests did I understand why. You might need to go through the same process, but you will eventually come to the same conclusion 😉
Anyway, in your situation, I would make
Nestedinto a proper standalone class, possibly in a separate package to make obvious that it’s a helper classes. Then I would write tests for it directly, independent of any other tests.Then I’d write tests for
NewStyleand focus only on the behaviour ofNewStyle.(Quite probably I would also inject
NestedintoNewStylerather than instantiating it withinNewStyle— i.e. make it an argument toNewStyle‘s constructor.Then when I write tests for
NewStylein the test I’d pass in an instance ofNestedand carry on. If I felt particularly tricky, I’d create an interface out ofNestedand create a second implementation, and testNewStylewith that, too.)