同一类中的模拟方法

2022-08-31 22:07:50

我正在使用Mockito来模拟我正在编写测试的同一类中的方法。我已经看到了SO(同一类中的嘲笑方法)的其他答案,但可能我误解了它们,因为我遇到了问题。

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

但是,我打印出期望,因为执行了方法B的定义。我的理解是,使用spyTemp会嘲笑methodB的定义。然而,情况似乎并非如此。

有人可以解释一下我哪里错了吗?


答案 1

第一个问题是,你必须使用spyTest对象来期望从Mockito获得一些东西。在这里,它与测试不同。 被 Mockito 对象包裹。spyTemptemp

另一个问题是,您只存根,但您正在尝试运行 。是的,在你的实现中你调用了方法B(),但你调用了 ,而不是 。在这里,您必须了解,只有在 的实例上调用模拟时,模拟才有效。它由一个Mockito代理包装,该代理捕获您的调用,如果您覆盖了某个方法,它将调用您的新实现而不是原始实现。但是由于调用了原始方法,因此在它内部,您对Mockito代理一无所知。因此,只有在运行时才调用“重写”方法methodB()methodA()methodA()this.methodB()spyTemp.methodB()tempspyTemp.methodB()

这应该有效:

Mockito.doReturn(true).when(spyTemp).methodB(Mockito.any()); 
boolean status = spyTemp.methodA("XYZ");

答案 2

您创建了一个间谍并嘲笑了.没错!但是你调用了原始对象。要获得正确的结果,请在间谍上调用它methodB()methodA()

boolean status = spyTemp.methodA("XYZ");

推荐