2011-09-01 28 views
5

मेरे पास मेरे कोड बेस में कक्षाओं में से एक में एक विधि है कि मेरे जीवन के लिए, मैं अपने जूनिट परीक्षणों में शामिल नहीं हो सकता। मूल रूप से इस वर्ग जब मैं एक डेटाबेस कनेक्शन का अनुरोध कहा जाता है, अगर एक बासी कनेक्शन दिया जाता है, एक नया कनेक्शन स्थापित हो जानेजावा - कोड कवरेज

यहाँ मेरी कक्षा (इस उद्देश्य के लिए कांट छांट)

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 का टुकड़ा है

कोई विचार कैसे मैं अपने जूनिट परीक्षणों को सुनिश्चित कर सकता हूं कि अगर कथन निष्पादित हो? मैं वर्तमान में EasyMock और Powermock उपयोग कर रहा हूँ, लेकिन अगर बयान इन उपकरणों

सभी मदद बहुत

सराहना की आप धन्यवाद का उपयोग कर डेमियन

उत्तर

8

आप करने के लिए अपने वर्ग refactor चाहिए मैं इस में जाने का कोई रास्ता नहीं मिल रहा है एक से प्राप्त होने के बजाय, एक अन्य डेटा स्रोत के लिए 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() को एक नई निजी/संरक्षित विधि पर कॉल करने के लिए कारक है। एक बार जब आप यह परिवर्तन कर लेंगे तो पावर मैक का उपयोग करके 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; 
} 
संबंधित मुद्दे