mock methods in same class

learningMyWayThru :

I am using Mockito to mock a method in the same class for which I am writing test. I have seen other answers on SO (Mocking method in the same class), but probably I am misunderstanding them, since I running into issues.

 class Temp() {

    public boolean methodA(String param) {

         try {

             if(methodB(param))
                   return true;

             return false;
         } catch (Exception e) {
               e.printStackTrace();
         }
    }
 }

My Test method:

 @Test
 public void testMethodA() {

    Temp temp = new Temp();
    Temp spyTemp = Mockito.spy(temp);

    Mockito.doReturn(true).when(spyTemp).methodB(Mockito.any()); 
    boolean status = temp.methodA("XYZ");

    Assert.assertEquals(true, status);
 }

I however get the expection printed out because definition of methodB gets executed. My understanding is definition of methodB would get mocked by using spyTemp. However that does not appear to be the case.

Can someone please explain where I am going wrong?

Konstantin Labun :

First issue is that you have to use spyTest object to expect something from Mockito. Here it is not the same as test. spyTemp is an wrapped by Mockito object temp.

Another issue is that you stub only methodB(), but trying to run methodA(). Yes in your implementation of methodA() you call methodB(), but you call at this.methodB(), not as spyTemp.methodB(). Here you have to understand that mocking would work only when you call it on the instance of temp. It's wrapped by Mockito proxy which catch your call and if you have overriden some method it would call your new implementation instead of original. But since original method called, inside it you know nothing about Mockito proxy. So your "overriden" method would be called only when you run spyTemp.methodB()

This should work:

Mockito.doReturn(true).when(spyTemp).methodB(Mockito.any()); 
boolean status = spyTemp.methodB("XYZ");

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=447439&siteId=1