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在调用它时的值
答案 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)));
}