Search code examples
javajmockit

JMockit no. of times API call


I'm testing if doSomething method is again getting called in catch block when exception occurs. How to validate if 'doSomething' got called twice ?

Class to be tested:

@Service
public class ClassToBeTested implements IClassToBeTested {

@Autowired
ISomeInterface someInterface;

public String callInterfaceMethod() {
 String respObj;
 try{
     respObj = someInterface.doSomething(); //throws MyException
 } catch(MyException e){
    //do something and then try again
    respObj = someInterface.doSomething();
 } catch(Exception e){
    e.printStackTrace();
  }
 return respObj;
 }
}

Test Case:

public class ClassToBeTestedTest
{
@Tested ClassToBeTested classUnderTest;
@Injectable ISomeInterface mockSomeInterface;

@Test
public void exampleTest() {
    String resp = null;
    String mockResp = "mockResp";
    new Expectations() {{
        mockSomeInterface.doSomething(anyString, anyString); 
        result = new MyException();

        mockSomeInterface.doSomething(anyString, anyString); 
        result = mockResp;
    }};

    // call the classUnderTest
    resp = classUnderTest.callInterfaceMethod();

    assertEquals(mockResp, resp);
}
}

Solution

  • The following should work:

    public class ClassToBeTestedTest
    {
        @Tested ClassToBeTested classUnderTest;
        @Injectable ISomeInterface mockSomeInterface;
    
        @Test
        public void exampleTest() {
            String mockResp = "mockResp";
            new Expectations() {{
                // There is *one* expectation, not two:
                mockSomeInterface.doSomething(anyString, anyString);
    
                times = 2; // specify the expected number of invocations
    
                // specify one or more expected results:
                result = new MyException();
                result = mockResp;
            }};
    
            String resp = classUnderTest.callInterfaceMethod();
    
            assertEquals(mockResp, resp);
        }
    }