Java 用于连接数据库的 JUNIT 测试用例

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22567843/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 16:32:34  来源:igfitidea点击:

JUNIT test case for connection with database

javajunit

提问by user3447784

This is the code which im testing for JDBC connection

这是我测试 JDBC 连接的代码

package com.sybase;


public class SybaseDBConnection {

    public static Properties prop = null;


    public static Connection getConnection(String databaseType) {

        Connection conn = null;
        // Properties prop = null;
        String database = null;
        String driver = null;
        String url = null;
        String user = null;
        String password = null;

        try {
            // prop = new Properties();
            // prop.load(SybaseDBConnection.class.getClassLoader()
            // .getResourceAsStream("com/properties/sybase.properties"));

            database = prop.getProperty("sybase." + databaseType
                    + ".databaseName");
            driver = prop.getProperty("sybase." + databaseType
                    + ".driverClassName");
            url = prop.getProperty("sybase." + databaseType + ".url");
            user = prop.getProperty("sybase." + databaseType + ".username");
            password = prop.getProperty("sybase." + databaseType + ".password");

            // String dbConUrl =
            // "jdbc:datadirect:sqlserver://nt64sl2003a.americas.progress.comsql2008;Port=1433;DatabaseName=test;User=test;Password=test;EnableBulkLoad=true;BulkLoadBatchSize="
            // + JDBC_BATCH_SIZE;

            String dbConUrl = url + SEMI_COLLAN + "DatabaseName=" + database
                    + SEMI_COLLAN + "User=" + user + SEMI_COLLAN + "Password="
                    + password + SEMI_COLLAN + "EnableBulkLoad=true"
                    + SEMI_COLLAN + "BulkLoadBatchSize=" + JDBC_BATCH_SIZE;

            System.out.println("The URL is : " + dbConUrl);

            SybDriver sybDriver = (SybDriver) Class.forName(driver)
                    .newInstance();
            sybDriver.setVersion(com.sybase.jdbcx.SybDriver.VERSION_6);
            DriverManager.registerDriver(sybDriver);
            conn = DriverManager.getConnection(dbConUrl);
        } catch (SQLException e) {
            System.err.println("Exception occured : SQLException : "
                    + e.getMessage());
            e.printStackTrace();
        } catch (InstantiationException e) {
            System.err.println("Exception occured : InstantiationException : "
                    + e.getMessage());
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            System.err.println("Exception occured : IllegalAccessException : "
                    + e.getMessage());
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            System.err.println("Exception occured : ClassNotFoundException : "
                    + e.getMessage());
            e.printStackTrace();
        }

        return conn;
    }

    public static void closeConnection(Connection conn) {
        try {
            if (null != conn) {
                conn.close();
                conn = null;
            }
        } catch (SQLException e) {
            e.printStackTrace();

        }
    }

    public static void closeResultset(ResultSet rs) {
        try {
            if (null != rs) {
                rs.close();
                rs = null;
            }
        } catch (SQLException e) {
            e.printStackTrace();

        }
    }

    public static void closePreparedStatement(PreparedStatement pstmt) {
        try {
            if (null != pstmt) {
                pstmt.close();
                pstmt = null;
            }
        } catch (SQLException e) {
            e.printStackTrace();

        }
    }

    public static void closeStatement(Statement stmt) {
        try {
            if (null != stmt) {
                stmt.close();
                stmt = null;
            }
        } catch (SQLException e) {
            e.printStackTrace();

        }
    }

    public static String getProperty(String property) {
        return prop.getProperty(property);
    }

    public static void main(String args[]) {
        SybaseDBConnection.getConnection("ase");
    }

}

I have written this test Case

我已经写了这个测试用例

public class SybaseStatementTest {

    Connection conn;
    Statement stmt;

    // Setup methods
    @BeforeClass
    public void beforeClass() {
        conn = null;
        stmt = null;
    }

    // clean up method
    @AfterClass
    public void releaseResource() {
        if (stmt != null) {
            SybaseDBConnection.closeStatement(stmt);
        }
        if (conn != null) {
            SybaseDBConnection.closeConnection(conn);
        }
    }


    // Test case to check close statement using ASE database
    @Before
    public void openConnBeforerStmtTestASE() throws SQLException {
        conn = SybaseDBConnection.getConnection("ase");
        stmt = conn.createStatement();
    }

    @After
    public void closeConnAfterStmtTestASE() {
        if (conn != null) {
            SybaseDBConnection.closeConnection(conn);
        }
    }

    @Test
    public void testCloseStatementASE() {
        SybaseDBConnection.closeStatement(stmt);
        Assert.assertNull("Error occured", stmt);
    }
}

I am getting an Initialization error(@BeforeClass should be static) when I run this Junit test case. Please can you help?

当我运行这个 Junit 测试用例时,我收到一个初始化错误(@BeforeClass 应该是静态的)。请问你能帮忙吗?

回答by fgb

@BeforeClassand @AfterClassoperate at the class level rather than on instances, so the methods need to be static.

@BeforeClass并且@AfterClass在类级别而不是在实例上操作,因此方法需要是静态的。

You can remove the beforeClassmethod. It is not doing anything useful because the instance variables will default to null anyway. And also change @AfterClassto @After.

您可以删除该beforeClass方法。它没有做任何有用的事情,因为无论如何实例变量都会默认为 null。并且也更改@AfterClass@After.

The test itself won't work because SybaseDBConnection.closeStatementis setting stmtto null but this is not visible outside the method because it's a local variable.

测试本身将不起作用,因为SybaseDBConnection.closeStatement它设置stmt为 null 但这在方法之外不可见,因为它是一个局部变量。

You can write the test like:

您可以像这样编写测试:

public class SybaseStatementTest {
    Connection connection;

    @Before
    public void before() {
        connection = SybaseDBConnection.getConnection("ase");
    }

    @After
    public void after() {
        SybaseDBConnection.closeConnection(connection);
    }

    @Test
    public void closeStatementShouldCloseStatement() {
        Statement statement = connection.createStatement();
        SybaseDBConnection.closeStatement(statement);
        assertTrue(statement.isClosed());
    }

    @Test
    public void closeStatementWithNullShouldNotThrow() {
        SybaseDBConnection.closeStatement(null);
    }
}