Is there any way of replacing the logic within a private method when running a JUnit test?
A bit of background: we have some private methods which interact with bundles within an OSGi container. This is not available in the unit test therefore the methods will fail.
We have looked at JMockIt but the method replace functionality seems to want to force you to replace all the methods in the class which call one another.
The implementation would be something like this:
public final doSomething() {
firstThing();
secondThing();
}
private firstThing() {
// normal code
}
private secondThing() {
// code which is unavailable in a unit test
}
And the unit test would specify the new implementation of secondThing():
// replace secondThing() in impl with this secondThing()
private secondThing() {
// dummy code
}
// run tests
解决方案
You certainly can solve this situation with JMockit.
One way would be to define a "mock-up" class, for example:
public class MyTest
{
@Test
public void testDoSomething()
{
new MockUp()
{
@Mock
void secondThing()
{
// do anything here
}
};
new ClassWhichDependsOnOtherBundles().doSomething();
}
}
Only the secondThing() method in the mocked class will be replaced by JMockit.
The JMockit Expectations API could also be used, with partial mocking.