2011-09-01 7 views
5

내 코드베이스의 클래스 중 하나에 내 junit 테스트를 사용할 수 없다는 메서드가 있습니다. 오래된 연결이 반환되는 경우 나는 데이터베이스 연결을 요청할 때 기본적으로이 클래스를 호출, 새 연결이 여기 Java - 코드 커버리지

(이 목적 아래로 손질) 내 수업

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; 
}} 
의 mthod의 조각입니다 설립

내 junit 테스트에서 if 문을 어떻게 실행할 수 있는지 생각해보십시오. 나는 현재 EasyMock에와 Powermock를 사용하고 있지만, 한 Statment는 당신이 당신의 클래스를 리팩토링해야 데미안

답변

8

이러한 도구

모든 도움을 크게

을 감사합니다 당신 감사를 사용하는 경우 나는이 들어갈 수있는 방법을 찾을 수 없습니다 하나에서 상속하는 것이 아니라 다른 데이터 소스에 대해 proxy이됩니다. 이렇게하면 실제 데이터 소스 대신 모의 데이터 소스를 쉽게 삽입 할 수 있습니다.

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

하나의 아이디어가 떠오른다. 상속보다는 집합체를 사용하라. 이 문제와 다른 사람들은 집계 된 객체를 모의 해 원하는 동작을 수행 할 수 있기 때문에 사라질 것입니다. 나는 거기에 직접 들어갈 다른 방법을 보지 못했다. 실제로 TCSOracleDataSourceWrapper라는 이름은 실제로 데이터 소스 (집합)를 래핑한다는 것을 이미 나타냅니다. 실제로는 그렇지 않습니다.

1

빠른 해결 방법 중 하나는 super.getConnection() 호출을 새로운 개인/보호 된 메소드로 분해하는 것입니다. 일단 변경을하면 power mock을 사용하여 getBaseConnection 메소드를 모의하기가 쉽습니다. 다른 해결책과 같이 래퍼 구현에 상속 대신 델리 게이션을 사용하는 것이 좋습니다.

Connection getBaseConnection() throws SQLException { 
    return super.getConnection(); 
} 

public final Connection getConnection() throws SQLException { 

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

    Connection connection = null; 
    try{ 
     connection = getBaseConnection();   
    } 
    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 = getBaseConnection(); 
     } 
     else 
     { 
      throw e; 
     } 
    }  
    return connection; 
} 
관련 문제