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

lea*_*ser 0 java junit mockito

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

class Temp() {

public boolean methodA(String param) {

     try {

         if(methodB(param))
               return true;

         return false;
     } catch (Exception e) {
           e.printStackTrace();
     }
}
}
Run Code Online (Sandbox Code Playgroud)

测试类

@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);
}
Run Code Online (Sandbox Code Playgroud)

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

Len*_*Boy 6

这是问题所在: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)));
}
Run Code Online (Sandbox Code Playgroud)

如果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)));
}
Run Code Online (Sandbox Code Playgroud)