使用 Mockito 模拟另一个类中的类方法

2022-09-02 22:16:45

我正在尝试使用Mockito / JUnit为这样的函数编写单元测试:

class1 {
 method {
  object1 = class2.method // method that I want to fake the return value
  // some code that I still want to run
 }
}

在 Mockito 中,有没有办法对 class2.method 的结果进行存根?我正在尝试提高 class1 的代码覆盖率,因此我需要调用其实际生产方法。

我研究了Mockito API的间谍方法,但这会覆盖整个方法,而不是我想要的部分。


答案 1

我想我理解你的问题。让我再说一遍,你有一个函数,你正在尝试测试,并希望模拟在该函数内调用的函数的结果,但在不同的类中。我通过以下方式处理了这个问题。

public MyUnitTest {
    private static final MyClass2 class2 = mock(MyClass2.class);

    @Begin
    public void setupTests() {
        when(class2.get(1000)).thenReturn(new User(1000, "John"));
        when(class2.validateObject(anyObj()).thenReturn(true);
    }

    @Test
    public void testFunctionCall() {
        String out = myClass.functionCall();
        assertThat(out).isEqualTo("Output");
    }
}

这样做的目的是,在用@Before注释包装的函数中,我正在设置我希望class2中的函数如何响应给定的特定输入。然后,从实际测试中,我只是在要测试的类中调用我尝试测试的函数。在本例中,myClass.functionCall() 正常运行,您没有覆盖它的任何方法,而只是模拟了它从 MyClass2 中的方法(或方法)获得的输出。


答案 2

这对我有用:

public class Class1Test {

  Class1 class1;

  @Before
  public void setUp() {
    MockitoAnnotations.initMocks(this);
    class1 = new Class1();
  }

  @Test
  public void testClass1Method() {

    Class2 class2 = Mockito.mock(Class2.class);
    class1.setClass2(class2);
    Mockito.when(
            class2.class2Method(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())).thenReturn("some response");

    String actualResponse = class1
            .class1Method("12345", "3333", "4444");
    assertEquals("some response", actualResponse);
  }
}

推荐