与Mockito的DriverManager

时间:2018-06-03 12:48:12

标签: java mockito byte-buddy

我正在尝试将库迁移到java 10,但我对Mockito和Byte Buddy有一些错误。这是

的注册逻辑
java.sql.Driver underlayingDriver = mock(java.sql.Driver.class);
underlayingDriver = mock(java.sql.Driver.class);
DriverManager.registerDriver(underlayingDriver);

和用法:

List<java.sql.Driver> driversInManager = Collections.list(DriverManager.getDrivers());

JDK的内部部分出现问题,因为它试图通过类加载器加载类:

private static boolean isDriverAllowed(Driver driver, ClassLoader classLoader) {
    boolean result = false;
    if (driver != null) {
        Class<?> aClass = null;
        try {
            aClass =  Class.forName(driver.getClass().getName(), true, classLoader);
        } catch (Exception ex) {
            result = false;
        }

         result = ( aClass == driver.getClass() ) ? true : false;
    }

    return result;
}

Mocked类类加载器与JUnits调用者类不同。

如何从其他类加载器加载正确的驱动程序?

1 个答案:

答案 0 :(得分:0)

这里的问题是驱动程序管理器的类加载器敏感性。对于java.类,Mockito不能将模拟注入引导加载程序,而是将模拟类移动到不同的类加载器中,因为模拟必须能够看到Mockito类。

也许你可以通过创建一个伪驱动程序类来解决这个问题:

interface MyDriver extends java.sql.Driver {}

并创建该类的模拟。这样,您的类加载器和驱动程序的加载器应该完全相同。