java Mockito 3+如何让mockstatic返回另一个普通的mock

gudnpqoy  于 2023-05-21  发布在  Java
关注(0)|答案(1)|浏览(156)

我正在从PowerMockito&MockitoV2迁移到MockitoV 3+,并尝试重写我的测试
以前我有一个测试,其中mocker java.sql.DriverManager类的静态方法getConnection(...)返回一个普通的Mockito.mock(java.sql.Connection.class),现在我试图做一些类似于MockedStatic的事情,但不能使静态mock返回另一个普通的mock,有这样的错误:
org.mockito.exceptions.misusing.WrongTypeOfReturnValue:Connection$MockitoMock$sLucRb7f不能被getConnection()返回getConnection()应该返回Connection***如果你不确定为什么你会得到上面的错误,请继续阅读。由于语法的性质,可能会发生上述问题,因为:
1.这个异常 * 可能 * 发生在错误编写的多线程测试中。请参考Mockito常见问题解答了解并发测试的限制。

  • 使用when(spy.foo()).then()语法清除间谍。更安全的方法是-
  • 关于doReturn| Throw()方法族。Mockito.spy()方法的javadocs中的更多内容。

我的测试代码看起来像这样:

@Test
    public void testConnectionIsOk() {
        Connection mockedConnection = Mockito.mock(Connection.class);
        try (MockedStatic<DriverManager> driverManagerMockedStatic = Mockito.mockStatic(DriverManager.class)) {
            driverManagerMockedStatic.when(
                    () -> DriverManager.getConnection(Mockito.anyString(), Mockito.anyString(), Mockito.anyString()))
                    .thenReturn(mockedConnection);
            boolean isConnectionOK = sut.testMethod();

            Assertions.assertTrue(isConnectionOK);
        }
    }

我知道错误要求我使用Mockito.doReturn(mockedConnection).when(...),但我无法在该.when(...)块中传递静态方法调用
此用例是否有任何变通方法,或者我是否遗漏了什么?

a14dhokn

a14dhokn1#

你可以使用use thenAnswer而不是thenReturn,并返回lambda表达式,如下所示:

@Test
public void testConnectionIsOk() {
    Connection mockedConnection = Mockito.mock(Connection.class);
    try (MockedStatic<DriverManager> driverManagerMockedStatic = Mockito.mockStatic(DriverManager.class)) {
        driverManagerMockedStatic.when(() -> DriverManager.getConnection(Mockito.anyString(), Mockito.anyString(), Mockito.anyString()))
                .thenAnswer(invocation -> mockedConnection);

        boolean isConnectionOK = sut.testMethod();

        Assertions.assertTrue(isConnectionOK);
    }
}

相关问题