使用Mockito间谍模拟一个类中的方法

时间:2017-10-12 12:59:26

标签: java junit mockito

参考mock methods in same class

class Temp() {

public boolean methodA(String param) {

     try {

         if(methodB(param))
               return true;

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

测试类

@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);
}

当调用实际类tempA时,methodA应返回模拟方法B值。因此回归真实。为什么这不正确。我遇到了同样的问题。 我想在真实类上运行测试,而不是像答案所建议的那样对模拟对象运行。我想运行类methodA并期望模拟对象spyTemp methodB在调用它时的值

1 个答案:

答案 0 :(得分:3)

以下是问题:methodA()您的callint来自temp,您已经从tempSPY定义了返回值。

因此,您需要致电tempSpy.methodA(),然后返回已定义的methodB()的值。

此处解决方案methodB()public - spy temp / cut并以此方式调用:

// temp = cut
@Test
public void testMethodA_valid() {
    // given
    Temp spyTemp = Mockito.spy(temp);
    boolean expected = true;
    Mockito.doReturn(expected).when(spyTemp).methodB(Mockito.any(String.class)); 

    // when
    boolean actual = spyTemp.methodA("XYZ");

    // then (faster readable)       
    Mockito.verify(spyTemp, times(1)).methodB(any(String.class))
    Mockito.verifyNoMoreInteraction(<ALL YOUR MOCKS HERE>);
    Assert.assertEquals(expected, is(equalTo(actual)));
}

如果methodB()是私有的,则无法定义应返回的内容。然后不仅仅是这个,如果发生错误,那么methodB()行为错误:

@Test
public void testMethodA_valid() {
    // given
    boolean expected = true;

    // when
    boolean actual = temp.methodA("XYZ");

    // then (faster readable)       
    Assert.assertEquals(expected, is(equalTo(actual)));
}