Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java - Code Coverage

I have a method in one of the classes in my code base that for the life of me, I cannot get into with my junit tests. Basically this class is called when I request a database connection, if a stale connection is returned, a new connection is established

Here is the snippet of the mthod in my class (trimmed down for this purpose)

public class TCSOracleDataSourceWrapper extends OracleDataSource {

private static final int STALE_CONNECTION_EX_CODE = 17143;
private OracleConnectionCacheManager cacheManager;  
private String cacheName;
/** Local log variable **/
private final Log logger = LogFactory.getLog(getClass());


/**
 * Class constructor
 * @throws SQLException
 */
public TCSOracleDataSourceWrapper() throws SQLException {
    super();
}

private static final long serialVersionUID = 1L;

@Override
/**
 * Get a connection but if the connection is stale then refresh all DB connections
 * 
 */
public final Connection getConnection() throws SQLException {

    logger.debug("Retrieving a database connection from the pool");

    Connection connection = null;
    try{
        connection = super.getConnection();         
    }
    catch(SQLException e)
    {

        if(e.getErrorCode() == STALE_CONNECTION_EX_CODE)
        {               
            logger.error("Stale Oracle connection found in the Connection Pool. Refreshing invalid DB connections.");
            //refresh invalid connections
            cacheManager.refreshCache(cacheName, OracleConnectionCacheManager.REFRESH_INVALID_CONNECTIONS);
            //now try to get the connection again
            connection = super.getConnection();
        }
        else
        {
            throw e;
        }
    }       

    return connection;
}}

Any idea how I can ensure my junit tests execute the if statement? I am currently using EasyMock and Powermock but I cannot find a way to get into this if statment using these tools

All help is greatly appreciated

Thank you Damien

like image 837
Damien Avatar asked Sep 01 '11 16:09

Damien


People also ask

Is JUnit a code coverage tool?

With JUnit 4 with Enhanced Code Coverage you will see results under JUnit Code Coverage Workspace Results for each JUnit test case within a JUnit test suite. Run the JUnit. View the results. The results of the run are available in the Code Coverage Results view.

What does coverage do in Java?

Test measurement helps in identifying and minimizing bugs and design defects in your code. While there are various methodologies to measure test effectiveness, code coverage is one of the most popular.

Is Maven Java code coverage tool?

JaCoCo-Maven (abbreviation for Java Code Coverage) plugin is an open-source code coverage tool for Java. It creates code coverage reports and integrates well with IDEs(Integrated development environments) like Eclipse IDE.

What is JUnit coverage?

Eclipse can check your code coverage when it runs your JUnit testing class. This means that it can show you what statements were executed in at least one test case and what ones weren't. For an if-statement, it will tell you whether there was a test case for the condition to be false and another for it to be true.


1 Answers

You should refactor your class to become a proxy for another data source, rather than inherit from one. This way you can easily inject into it a mock data source instead of the real one.

import javax.sql.DataSource;

public class TCSOracleDataSourceWrapper implements DataSource {
  ...
  private DataSource wrappedDataSource;
  ...

  public TCSOracleDataSourceWrapper(DataSource ds) {
    wrappedDataSource = ds;
  }

  ...

  public final Connection getConnection() throws SQLException {
    ...

    Connection connection = null;
    try{
        connection = ds.getConnection();         
    }
    catch(SQLException e)
    {
        ...
    }       

    return connection;
  }
}
like image 176
Péter Török Avatar answered Nov 15 '22 11:11

Péter Török