Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

mockito : how to unmock a method?

I have a JUnit class with different methods to perform different tests.

I use Mockito to create a spy on real instance, and then override some method which is not relevant to the actual test I perform.

Is there a way, just for the sake of cleaning up after me in case some other tests that run after my tests also use the same instances and might execute a mocked method they didn't ask to mock, to un-mock a method?

say I have a spy object called 'wareHouseSpy'

say I overriden the method isSomethingMissing :

doReturn(false).when(wareHouseSpy).isSomethingMissing()

What will be the right way to un-override, and bring things back to normal on the spy i.e make the next invokation of isSomethingMissing to run the real method?

something like

doReturn(Mockito.RETURN_REAL_METHOD).when(wareHouseSpy).isSomethingSpy()

or maybe

Mockito.unmock(wareHouseSpy)

Who knows? I couldn't find nothing in that area

Thanks!

Assaf

like image 359
user1045740 Avatar asked Nov 14 '11 14:11

user1045740


4 Answers

I think

Mockito.reset(wareHouseSpy)

would do it.

like image 139
Don Roby Avatar answered Oct 22 '22 02:10

Don Roby


Let's say most of your tests use the stubbed response. Then you would have a setUp() method that looks like this:

@Before
public void setUp() {
  wareHouseSpy = spy(realWarehouse);
  doReturn(false).when(wareHouseSpy).isSomethingMissing();
}

Now let's say you want to undo the stubbed response and use the real implementation in one test:

@Test
public void isSomethingMissing_useRealImplementation() {
  // Setup
  when(wareHouseSpy.isSomethingMissing()).thenCallRealMethod();

  // Test - Uses real implementation
  boolean result = wareHouseSpy.isSomethingMissing();
}
like image 20
Mike Tran Avatar answered Oct 22 '22 03:10

Mike Tran


It depends whether you are testing with TestNG or JUnit.

  • JUnit creates a new instance of itself for each test method. You basically don't have to worry about reseting mocks.
  • With TestNG, you have to reset the mock(s) with Mockito.reset(mockA, mockB, ...) in either an @BeforeMethod or an @AfterMethod
like image 11
Brice Avatar answered Oct 22 '22 02:10

Brice


The "normal" way is to re-instantiate things in your "setUp" method. However, if you have a real object that is expensive to construct for some reason, you could do something like this:

public class MyTests {

  private static MyBigWarehouse realWarehouse = new MyBigWarehouse();
  private MyBigWarehouse warehouseSpy;

  @Before
  public void setUp() {
    warehouseSpy = spy(realWarehouse); // same real object - brand new spy!
    doReturn(false).when(wareHouseSpy).isSomethingMissing();
  }

  @Test
  ...

  @Test
  ...

  @Test
  ...
}
like image 4
jhericks Avatar answered Oct 22 '22 03:10

jhericks