flareback
flareback

Reputation: 498

Mock a static method that's inside a static method

I have a static method (foo) that calls another static method (bar). I would like to mock the response of bar in my test. Is this possible with PowerMockito or another tool? the only results I can find are for mocking statics inside of non-static methods.

public class SomeClass {
   static List<String> foo() {
      ...
      int barResult = bar();
      ...
   }

   static int bar() {
      // make a database call
      return DAO.getDao().runQuery();
   }
}

And my test will call it like:

@RunWith(PowerMockRunner.class)
public class SomeClassTest {

   @PrepareForTest(SomeClass.class)
   @Test
   public void fooTest() {
      List<String> actualResult = SomeClass.foo();
      assertTrue(...);
   }
}

Am I going to have to mock the internals of bar? So mock the DAO?

Upvotes: 3

Views: 6578

Answers (2)

Shizheng Zhang
Shizheng Zhang

Reputation: 41

You can do:

@RunWith(PowerMockRunner.class)
@PrepareForTest({SomeClass.class, DAO.class})
public class SomeClassTest {

   @Test
   public void fooTest() {
      PowerMockito.mockStatic(DAO.class);
      Mockito.when(DAO.getDao().runQuery()).return(..);
      List<String> actualResult = SomeClass.foo();
      assertTrue(...);
   }
}

Upvotes: 0

GhostCat
GhostCat

Reputation: 140457

You can't do that.

Only PowerMock allows you to mock static methods. But that works by "erasing" all static things within that class that gets "prepared" for testing by PowerMock.

If you were talking about ordinary methods, you could be going for Mockito spies, as those allow for partial mockings.

And just for the record: simply avoid using static, as using it leads to "hard to test" code.

In other words: instead of using the big ugly powermock hammer to "fix" your design problems... Consider fixing your broken design instead and thereby avoiding the need for PowerMock altogether!

And for the record: yes, you could solve your problem by mocking that static call on the DAO class (then you can control what bar() does indirectly. But again: that would just mean to put the "I tested it" label on code that should be reworked instead.

Upvotes: 2

Related Questions