Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Unit Test: Replace a private method under test

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
like image 771
James Carr Avatar asked Jul 01 '26 05:07

James Carr


1 Answers

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<ClassWhichDependsOnOtherBundles>()
        {
            @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.

like image 95
Rogério Avatar answered Jul 04 '26 06:07

Rogério