如何模拟Junit对内部方法的调用



我有MyClass,我正在为每个方法(Method1Test)做一个测试类

public class MyClass {
    public int method1(){
        int a = method2();
        return a;
    }
    public int method2(){
        return 0;
    }
}
@RunWith(MockitoJUnitRunner.class)
public class Method1Test {
    @InjectMocks
    private MyClass myClass = new MyClass();
    @Before
    public void setup(){}
    @Test
    public void test01(){
        Mockito.when(myClass.method2()).thenReturn(25);
        int a = myClass.method1();
        assertTrue("We did it!!!",a==25);
    }
}

问题是,我无法模拟对方法2的调用,使其返回不同的值。莫基托的句子不起作用。

非常感谢^_^

您必须在测试中的类上创建一个spy,并通过重新定义spy 的method2()的行为来部分模拟它

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;

public class Method1Test {
  private MyClass myClass = new MyClass();
  @Test
  public void test01(){
    //given
    MyClass spy = spy(myClass); //create a spy for class-under-test
    when(spy.method2()).thenReturn(25); //partially override behavior of the spy
    //when
    int a = spy.method1(); //make the call to method1 of the _spy_!
    //then
    assertEquals(25, a);
  }
}

除此之外,您的测试既不需要Mockito Runner也不需要@InjectMocks,因为您没有将@Mock注释的mock注入到测试中的类中。

此外,只有当断言条件为NOT时,才会显示assertTrue语句中的消息。所以它应该是至少"我们失败了!!";)

最终,我找到了一个横向解决方案,而没有创建新的类(我一直无法做到这一点,因为它在实际项目中被禁止)。我把测试中的方法改写了。

解决方案是

public class MyClass {
    public int method1(){
        int a=0;
        a=method2();
        return a;
    }
    public int method2(){
        return 1;
    }
}
@RunWith(MockitoJUnitRunner.class)
public class Method1Test {
    @InjectMocks
    private MyClass myClass = new MyClass(){
        public int method2(){
            return 25;
        }
    };
    @Before
    public void setup(){}
    @Test
    public void test001(){
        Mockito.when(myClass.method2()).thenReturn(25);
        int a = myClass.method1();
        assertTrue("We did it!!!",a==25);
    }
}

我使用下面的代码尝试了解决方案,但没有通过。

Mockito.when(myClass.method2()).thenReturn(25);

之后,我尝试了一些不同的东西,并成功地通过了测试,而不是上面的代码片段。看看:

Mockito.doReturn(25).when(myClass).method2();

为了模拟测试(它可能是一个内部方法),您必须使用doReturn()方法。

对于任何方法,您都可以使用doThrow()、doAnswer()、doNothing()、do Return()和doCallRealMethod()来代替带有when()的相应调用。当你

  • 短柱空心法
  • 间谍对象上的存根方法(见下文)
  • 多次存根相同的方法,以便在测试过程中更改mock的行为

但你可能更喜欢用这些方法来代替其他方法使用when(),用于所有的存根调用。

更多信息可在此处阅读https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#12

我们需要使用Mockito.spy()来模拟我们正在测试的同一个类,而不是在这里使用mock(class)。然后我们可以如下模拟我们想要的方法。

@Test
  public void method1Test() { 
  MyClass myClass = new MyClass();
  MyClass myClass1 = Mockito.spy(myClass);
  Mockito.doReturn(1).when(myClass1).method2();
  Assert.assertEquals(1, myClass1.method1());
     }
 }

相关内容

  • 没有找到相关文章

最新更新