user3447784
user3447784

Reputation: 51

JUNIT test case for connection with database

This is the code which im testing for JDBC connection

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?

Upvotes: 3

Views: 44916

Answers (1)

fgb
fgb

Reputation: 18569

@BeforeClass and @AfterClass operate at the class level rather than on instances, so the methods need to be static.

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

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

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);
    }
}

Upvotes: 4

Related Questions