如何对PowerManager,easymock,mockito,DriverManager.getConnection(“”)或DriverManager.getConnection(“”,“”,“”)进行单元测试

问题描述 投票:0回答:1

我想对该代码进行单元测试,以验证调用哪个DriverManager.getConnection()。根据条件使用DriverManager.getConnection(url,user,pass)或DriverManager.getConnection(url)。

我无法找到任何Gradle示例作为对此进行测试的参考。

static void testDbConnectivity(HashMap<DbConfigParam, String> options) {
        DatabaseVendor dbVendor = Enum.valueOf(DatabaseVendor.class, options.get(DbConfigParam.dbVendor));
        String host = options.get(DbConfigParam.host);
        String port = options.get(DbConfigParam.port);
        String db = options.get(DbConfigParam.db);
        String user = options.get(DbConfigParam.user);
        String pass = options.get(DbConfigParam.password);

        String url = String.format(dbVendor.getUrlFormat(), host, Integer.valueOf(port), db);
        System.out.format("Database URL: %s %n", url);


        try {
            Class.forName(dbVendor.getDriverClass());
        } catch (Exception e) {
            throw new IllegalStateException(String.format("Error checking database connectivity.%n %s", Utils.getStacktrace(e)));
        }
        try  {
            Connection connection = null;
            if(dbVendor.getVendorName().equalsIgnoreCase("mssql") && Utils.containsIgnoreCase(url,"Authentication=ActiveDirectoryMsi")){
                connection  = DriverManager.getConnection(url);
            }else {
                connection =  DriverManager.getConnection(url, user, pass);
            }
            System.out.format("Connection Established. Database Version: %s %n",
                    connection.getMetaData().getDatabaseProductVersion());
        } catch (Exception e) {
                throw new IllegalStateException(String.format("Error checking database connectivity.%n %s", e.getMessage()));
            }
        }

这里是我正在编写测试用例

package com.acl.db;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.modules.junit4.PowerMockRunner;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;

import static org.mockito.Mockito.*;

@RunWith(PowerMockRunner.class)
public class DbConnectionValidatorTest {

    @Before
    public void setup() throws SQLException {




    }

    @After
    public void tearDown(){

    }

    @Test
    public void testTestDbConnectivityWithMSI()throws Exception {


        Connection connection = mock(Connection.class);

        PowerMockito.mockStatic(DriverManager.class);
        PowerMockito.when(DriverManager.class, "getConnection", anyString(), anyString(), anyString()).thenReturn(connection);

        // when(driverManager.getConnection(anyString()));
        HashMap<DbConfigParam, String> options = new HashMap<>();
        options.put(DbConfigParam.host,"");
        options.put(DbConfigParam.port,"");
        options.put(DbConfigParam.db,"");
        options.put(DbConfigParam.user,"");
        options.put(DbConfigParam.password,"");

        DbConnectionValidator dbConnectionValidator = new DbConnectionValidator();
        dbConnectionValidator.testDbConnectivity(options);

       // verify()
    }


}

抛出错误,例如

Testing started at 4:56 PM ...
> Task :keycloak-acl:utils:datasource-updater:cleanTest
> Task :keycloak-acl:utils:datasource-updater:compileJava UP-TO-DATE
> Task :keycloak-acl:utils:datasource-updater:processResources NO-SOURCE
> Task :keycloak-acl:utils:datasource-updater:classes UP-TO-DATE
> Task :keycloak-acl:utils:datasource-updater:compileTestJava
> Task :keycloak-acl:utils:datasource-updater:processTestResources NO-SOURCE
> Task :keycloak-acl:utils:datasource-updater:testClasses
> Task :keycloak-acl:utils:datasource-updater:test FAILED

No suitable driver found for 
java.sql.SQLException: No suitable driver found for 
    at java.sql.DriverManager.getConnection(DriverManager.java:689)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.powermock.reflect.internal.WhiteboxImpl.performMethodInvocation(WhiteboxImpl.java:1873)
    at org.powermock.reflect.internal.WhiteboxImpl.doInvokeMethod(WhiteboxImpl.java:773)
    at org.powermock.reflect.internal.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:753)
    at org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:466)
    at org.powermock.api.mockito.PowerMockito.when(PowerMockito.java:473)
    at com.ca.devtest.acl.db.DbConnectionValidatorTest.testTestDbConnectivityWithMSI(DbConnectionValidatorTest.java:40)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:310)
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89)
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282)
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87)
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:122)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:106)
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
    at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:110)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)
    at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:62)
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
    at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
    at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:118)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:175)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:157)
    at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
    at java.lang.Thread.run(Thread.java:748)

com.ca.devtest.acl.db.DbConnectionValidatorTest > testTestDbConnectivityWithMSI FAILED
    java.sql.SQLException at DbConnectionValidatorTest.java:40
1 test completed, 1 failed
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':keycloak-acl:utils:datasource-updater:test'.
> There were failing tests. See the report at: file:///Users/ajay/driveD/project/10.6/keycloak/keycloak-acl/utils/datasource-updater/build/reports/tests/test/index.html
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/5.2.1/userguide/command_line_interface.html#sec:command_line_warnings
BUILD FAILED in 1s
4 actionable tasks: 3 executed, 1 up-to-date
java junit mockito powermock powermockito
1个回答
0
投票

我已经解决了我的问题,可以使用以下代码进行单元测试。

build.gradle

dependencies {
    testImplementation 'junit:junit:4.12'
    testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: '1.6.4'
    testCompile group: 'org.powermock', name: 'powermock-api-mockito', version: '1.6.4'
    compile group: 'com.microsoft.sqlserver', name: 'mssql-jdbc', version: '8.2.1.jre8'

}

DbConnectionValidatorTest

package com.acl.db;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;

import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;

import static org.mockito.Mockito.*;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.verifyStatic;

@RunWith(PowerMockRunner.class)
@PrepareForTest({DbConnectionValidator.class})
public class DbConnectionValidatorTest {
    @Test
    public void testTestDbConnectivityWithMSI()throws Exception {

        Connection conn = mock(Connection.class);
        mockStatic(DriverManager.class);
        mockStatic(DatabaseMetaData.class);
        when(DriverManager.getConnection(anyString())).thenReturn(conn);
        when(conn.getMetaData().getDatabaseProductVersion()).thenReturn("TestSuccessWithMSI");
        HashMap<DbConfigParam, String> options = new HashMap<>();
        options.put(DbConfigParam.dbVendor,"MSSQL");
        options.put(DbConfigParam.host,"localhost");
        options.put(DbConfigParam.port,"1433");
        options.put(DbConfigParam.db,"database=keycloakdb;Authentication=ActiveDirectoryMsi;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;");
        DbConnectionValidator dbConnectionValidator = new DbConnectionValidator();
        dbConnectionValidator.testDbConnectivity(options);
        verifyStatic();
        DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=database=keycloakdb;Authentication=ActiveDirectoryMsi;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;");

    }


    @Test
    public void testTestDbConnectivityNonMSI()throws Exception {

        Connection conn = mock(Connection.class);
        mockStatic(DriverManager.class);
        mockStatic(DatabaseMetaData.class);
        when(DriverManager.getConnection(anyString(),anyString(),anyString())).thenReturn(conn);
        when(conn.getMetaData().getDatabaseProductVersion()).thenReturn("TESTSuccessWithNoMSI");
        HashMap<DbConfigParam, String> options = new HashMap<>();
        options.put(DbConfigParam.dbVendor,"MSSQL");
        options.put(DbConfigParam.host,"localhost");
        options.put(DbConfigParam.port,"1433");
        options.put(DbConfigParam.db,"mssqldb");
        options.put(DbConfigParam.user,"test");
        options.put(DbConfigParam.password,"testpwd");
        DbConnectionValidator dbConnectionValidator = new DbConnectionValidator();
        dbConnectionValidator.testDbConnectivity(options);
        verifyStatic();
        DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=mssqldb","test","testpwd");

    }
}

我能够通过上述实现进行单元测试。

© www.soinside.com 2019 - 2024. All rights reserved.