Reputation: 3883
I use PowerMock 1.4.7 and JUnit 4.8.2
I need to mock only some static methods and I want others (from the
same class) just to return original value.
When I mock with mockStatic
and don't call when().doReturn()
all
static methods return their defaults - like null when returning Object
or false when returning boolean...etc. So I try to use
thenCallRealMethod
explicitly on each static method to return
default implementation (means no mocking/ no fakes) but I don't know
how to call it on every possible arguments variations (= I want for every possible input call original method). I only know how to mock concrete argument variation.
Upvotes: 19
Views: 36709
Reputation: 3622
I managed to use spy
and doReturn
to achieve it.
class MyStatic {
static String foo() { return "foo"; }
static String foobar() { return foo() + "bar"; }
}
@Test
public void thisShouldSpyStaticMethods() {
// arrange
spy(MyStatic.class);
doReturn("mocked foo").when(MyStatic.class);
MyStatic.foo();
// act
final String result = MyStatic.foobar();
// assert
assertThat(result).isEqualTo("mocked foobar");
}
The doReturn
followed by a call to the method to be mocked looks weird (at least to me), but seems to do the trick.
Using spy
with when(MyStatic.foo()).thenReturn("mocked foo")
doesn't work for me.
PowerMockito's documentation on mocking static method.
Upvotes: 1
Reputation: 10685
Based on this question PowerMockito mock single static method and return object
PowerMockito.mockStatic(MyStaticClass.class);
alone does not mock all methods (in recent versions of PowerMockito at least), only enables mocking later of individual methods.
Upvotes: 0
Reputation: 40510
You can also use the stubbing API:
stub(method(MyStaticClass.class, "getB")).toReturn("B");
Edit:
To use stub
and method
statically import methods from these packages:
org.powermock.api.support.membermodification.MemberModifier
org.powermock.api.support.membermodification.MemberMatcher
For more info refer to the documentation
Upvotes: 18
Reputation: 11775
You can use a spy on your static class and mock only specific methods:
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyStaticTest.MyStaticClass.class)
public class MyStaticTest {
public static class MyStaticClass {
public static String getA(String a) {
return a;
}
public static String getB(String b) {
return b;
}
}
@Test
public void should_partial_mock_static_class() throws Exception {
//given
PowerMockito.spy(MyStaticClass.class);
given(MyStaticClass.getB(Mockito.anyString())).willReturn("B");
//then
assertEquals("A", MyStaticClass.getA("A"));
assertEquals("B", MyStaticClass.getA("B"));
assertEquals("C", MyStaticClass.getA("C"));
assertEquals("B", MyStaticClass.getB("A"));
assertEquals("B", MyStaticClass.getB("B"));
assertEquals("B", MyStaticClass.getB("C"));
}
}
Upvotes: 33