2011-09-01 36 views
5

Tôi có một phương pháp trong một trong các lớp trong cơ sở mã của tôi mà cho cuộc sống của tôi, tôi không thể nhận được vào với các bài kiểm tra junit của tôi. Về cơ bản lớp này được gọi là khi tôi yêu cầu một kết nối cơ sở dữ liệu, nếu một kết nối cũ được trả lại, một kết nối mới được thiết lậpJava - Mã số Bảo hiểm

Dưới đây là đoạn mã của mthod trong lớp học của tôi (tỉa xuống cho mục đích này)

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

Bất kỳ ý tưởng nào về cách tôi có thể đảm bảo các bài kiểm tra junit của mình thực thi câu lệnh if? Tôi hiện đang sử dụng EasyMock và Powermock nhưng tôi không thể tìm thấy một cách để có được thành này nếu Statment sử dụng những công cụ này

Tất cả help is appreciated rất

Cảm ơn bạn Damien

Trả lời

8

Bạn nên cấu trúc lại lớp học của bạn để trở thành một proxy cho một nguồn dữ liệu khác, thay vì kế thừa từ một nguồn dữ liệu. Bằng cách này bạn có thể dễ dàng chèn vào nó một nguồn dữ liệu giả thay vì một nguồn thực.

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

Một ý tưởng lưu ý: sử dụng tổng hợp thay vì kế thừa. Vấn đề này và những người khác như nó sẽ biến mất bởi vì bạn có thể giả sử đối tượng tổng hợp để có bất kỳ hành vi nào bạn muốn. Tôi không thấy một cách nào khác để vào đó ngay. Trong thực tế, tên TCSOracleDataSourceWrapper đã chỉ ra rằng nó bao bọc một nguồn dữ liệu (tập hợp), khi nó thực sự không phải là.

1

Một cách giải quyết nhanh chóng là tính đến lệnh gọi super.getConnection() cho phương thức riêng tư/được bảo vệ mới. Khi bạn thực hiện thay đổi đó, bạn có thể dễ dàng giả lập phương thức getBaseConnection bằng cách sử dụng mô hình nguồn. Đây là sửa chữa ngắn hạn, giống như các câu trả lời khác cho thấy nó là tốt hơn để sử dụng đoàn thay vì thừa kế cho việc thực hiện wrapper.

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; 
} 
Các vấn đề liên quan