tryingToLearn
tryingToLearn

Reputation: 11653

Powermock verifyPrivate does not work with any()

I have a private method whose invocation I want to test without caring about the arguments. I want to test if it was called at all or not.

MyClass.java

public void doStuff(){
    unload(args);
}

private void unload(List<String> args) {
    // 
}

So I used following:

MyClasstest.java

MyClass myClass = PowerMockito.spy(new MyClass());
myClass.doStuff();
verifyPrivate(myClass, times(1)).invoke("unload",any(List.class));
//     verifyPrivate(myClass, times(1)).invoke("unload",any());  //same result with this

This test fails with following exception:

Wanted but not invoked com.MyClass.unload( null );

However, there were other interactions with this mock ....... (actual values with which it was called)

Can verifyPrivate be called with only actual arguments & not with any()?

Upvotes: 1

Views: 6998

Answers (1)

second
second

Reputation: 4259

Here is a working example of what you are trying to do:

You might just missing the @PrepareForTest annotation, which has to point to the correct class. If your class is an external one use @PrepareForTest(MyClass.class), the example below shows it with an internal class.

@RunWith(PowerMockRunner.class)
@PrepareForTest(MyClassTest.class)
public class MyClassTest {

    static class MyClass {

        public void doStuff(){
            unload(null);
        }

        private void unload(List<String> args) {
        }
    }

    @Test
    public void test() throws Exception {
        MyClass myClass = PowerMockito.spy(new MyClass());
        myClass.doStuff();
        PowerMockito.verifyPrivate(myClass, Mockito.times(1)).invoke("unload", Mockito.any());
    }
}

Note that you should consider whether you really want to do this in a UnitTest. Normally your UnitTest should not be concerned about whether a private method is used or not, it should be focused on verifying that the correct result is returned or the correct object state is reached.

By adding knowledge about the internal behaviour of the class into it, you test is tightly coupled to the implementation which might not be a good thing.

Upvotes: 1

Related Questions