2016-06-23 10 views
7

मैं एक एकीकरण परीक्षण के लिए DBUnit उपयोग कर रहा हूँ नहीं पहचानता है, और इस त्रुटि में परीक्षण कोड मैं चल रहा हूँ निष्पादित करने से पहले:DBUnit PostgresqlDataTypeFactory enum सूची

badges.track_types data type (2003, '_text') not recognized and will be ignored. See FAQ for more information. 

org.dbunit.dataset.NoSuchColumnException: badges.TRACK_TYPES - (Non-uppercase input column: track_types) in ColumnNameToIndexes cache map. Note that the map's column names are NOT case sensitive. 

स्तंभ नजरअंदाज कर दिया है की एक सूची है enums। डाटासेट इसे इस तरह लिखा है में:

<?xml version='1.0' encoding='UTF-8'?> 
<dataset> 
    // More info ... 
    <badges name="30&apos;000" description="30k a day" image_name="30000.png" threshold_val="30000.00000000" has_many="true" id="45" track_types="{TRACK_GENERIC}" "/> 
</dataset> 

मैं DBUnit सवाल जवाब में देखा और this issue देखा था, का कहना है कि मैं समर्थन करने के लिए मेरी enum Postgresql है isEnumType() विधि ओवरराइड करने के लिए है, इसलिए मैं इस किया था:

/** 
* Override method to set custom properties/features 
*/ 
protected void setUpDatabaseConfig(DatabaseConfig config) { 

    config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new PostgresqlDataTypeFactory(){ 
     public boolean isEnumType(String sqlTypeName) { 
      if(sqlTypeName.equalsIgnoreCase("track_types")){ 
       return true; 
      } 
      return false; 
     } 
    }); 
    config.setProperty(DatabaseConfig.PROPERTY_METADATA_HANDLER, new DefaultMetadataHandler()); 
} 

लेकिन मुझे अभी भी वही त्रुटि मिलती है, और मुझे नहीं पता कि क्यों। शायद मैं विधि को अच्छी तरह से ओवरराइड नहीं कर रहा हूं? शायद यह मेरी समस्या का कारण भी नहीं है? यदि आपको किसी अन्य कोड की आवश्यकता है तो पूछें, धन्यवाद! अपने मूल्य के साथ enum लागू करने के लिए

+0

क्या आपके डेटासेट 'बैज' में कॉलम 'TRACK_TYPES' है? –

+0

क्या आप मुझे अपना स्रोत कोड भेज सकते हैं? मैं इसे खोदने की कोशिश करूंगा। –

+0

@ केविनवालिस मैंने अभी प्रश्न को अपडेट किया है ताकि आप डेटासेट पंक्ति देख सकें। हां, इसमें वह कॉलम है, लेकिन इसे त्रुटि राज्यों के रूप में अनदेखा किया गया है। – alfizqu

उत्तर

1

खैर बचाने ... मैं इस वास्तव में हल करने में सक्षम नहीं था, लेकिन इसे हल करने में कामयाब एक कामकाज से।

यह त्रुटि @DatabaseSetup एनोटेशन की वजह से आती है। यदि मैंने इसका उपयोग किए बिना इस प्रक्रिया को किया है, तो यह अभी भी 'कॉलम नहीं पहचाना गया' त्रुटि फेंकता है, क्योंकि यह पोस्टग्रेज़ एरे (जो मूल कारण था) को पहचानता नहीं है) लेकिन मैं इसे एक नया डेटा टाइपइप फैक्ट्री बनाकर हल कर सकता हूं जो विस्तारित करता है डिफ़ॉल्ट से:

public class PsqlArrayDataTypeFactory extends DefaultDataTypeFactory { 
     public DataType createDataType(int sqlType, String sqlTypeName) throws DataTypeException { 
      if (sqlType == Types.ARRAY) 
      { 
       return DataType.VARCHAR; 
      } 

      return super.createDataType(sqlType, sqlTypeName); 
     } 
    } 
2

कोशिश

enum.values(); 

यह एक सरणी लौटने से आप इस तत्व

+0

मुझे enum जारी रखना चाहिए? SetUpDatabaseConfig विधि में? – alfizqu

+0

'EntityManager' का उपयोग करने का प्रयास करें, इसमें 'persist (obj) 'विधियां हैं – Irazza

1

वहाँ PostgreSQL enums के लिए सीमित समर्थन है केवल पढ़ने और तार लिख dbunit 2.4.6 के बाद से समर्थित है क्योंकि। तो आप इस तरह PostgresqlDataTypeFactory में विधि "isEnumType" ओवरराइड करने के लिए है करने के लिए:

PostgresqlDataTypeFactory factory = new PostgresqlDataTypeFactory(){ 
    public boolean isEnumType(String sqlTypeName) { 
    if(sqlTypeName.equalsIgnoreCase("abc_enum")){ 
     return true; 
    } 
    return false; 
    } 
}; 
0

मैं अगले त्रुटि थी:

Caused by: org.postgresql.util.PSQLException: ERROR: column "status" is of type topic_status but expression is of type character varying 
    Hint: You will need to rewrite or cast the expression. 

DbUnit तालिका के लिए मेटा अनुरोध करता है और से enums के लिए एक प्रकार VARCHAR प्राप्त करता है PostgreSQL। लेकिन PostgreSQL इस प्रकार को वापस स्वीकार नहीं करेगा।

config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, 
    new PostgresqlDataTypeFactory() { 
     @Override 
     public boolean isEnumType(String sqlTypeName) { 
      return "topic_status".equalsIgnoreCase(sqlTypeName); 
     } 

     @Override 
     public DataType createDataType(int sqlType, String sqlTypeName) throws DataTypeException { 
      if (isEnumType(sqlTypeName)) { 
       sqlType = Types.OTHER; 
      } 
      return super.createDataType(sqlType, sqlTypeName); 
     } 
    }); 
); 

यह OTHER के रूप में enum और माता पिता के विधि super.createDataType(sqlType, sqlTypeName) के लिए प्रकार सेट उचित तरीके से DataType बनाता है:

मैं अगले रास्ते में PostgresqlDataTypeFactory से तरीकों overrode।

PostgreSQL संस्करण: 9.6.5
DbUnit संस्करण: 2.5.4

अधिक जानकारी discussion पर पाया जा सकता है।