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



>引用同一类中的模拟方法

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

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

问题是:methodA() 调用来自temp,并且您已经定义了来自tempSPY的返回值。

因此,您需要调用tempSpy.methodA()然后它返回您定义的methodB()的值。

如果methodB() public,这里的解决方案 - 间谍温度/切割并这样称呼它:

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

相关内容

  • 没有找到相关文章