2016-06-23 45 views
7
Bir uyum testi için DbUnit kullanıyorum

tanır gelmez enums. Böyle yazıldığı veri kümesinde :DBUnit PostgresqlDataTypeFactory değil, ve bu hatayla koşuyorum test kodu çalıştırmadan önce enum listesini

<?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> 

Ben DBUnit SSS baktı ve this issue gördüm, benim enum Postgresql olduğunu destekleyecek isEnumType() yöntemini geçersiz kılmak zorunda olduğunu söylüyor, bu yüzden bu yaptı:

/** 
* 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()); 
} 

Yine de aynı hatayı alıyorum ve nedenini bilmiyorum. Belki de metodu iyi işlemez miyim? Belki de benim sorunumun sebebi de değil? Başka bir kod gerekiyorsa, sadece sor, teşekkürler!

+0

Veri kümeniz "rozetleri" bir TRACK_TYPES sütunu içeriyor mu? –

+0

Kaynak kodunuzu gönderir misiniz? Onu kazmaya çalışacağım. –

+0

@KevinWallis Veri kümesini görebilmeniz için soruyu yeni güncelledim. Evet, bu sütunu içerir, ancak hata durumları olarak göz ardı edilir. – alfizqu

cevap

1

Eh kaydetmek daha bir dizi döndürür değeri ile enum devam etmek ... Ben tam olarak bunu çözmek mümkün değildi ama bunu çözmek başardı bir geçici çözüm tarafından.

Bu hata, @DatabaseSetup ek açıklaması nedeniyle oluşur. Bu işlemi kullanmadan yapsaydım, hala bir 'sütun tanınmadı' hatası atar, çünkü postgres dizilerini tanımadı (bu benim sahip olduğum kök nedenti) ama bunu uzatacak yeni bir DataTypeFactory oluşturarak çözebilirdim varsayılan itibaren: postgresql çeteleler için sınırlı destek var

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

deneyin

enum.values(); 

Sen bu eleman

+0

Enum'u nerede devam ettirmeliyim? SetUpDatabaseConfig yönteminde? – alfizqu

+0

'EntityManager'ı kullanmaya devam edin,' persist (obj) 'yöntemleri vardır. – Irazza

1

sadece okuma ve dizeleri yazarken DBUnit 2.4.6 beri desteklendiğinden. böylece böyle PostgresqlDataTypeFactory yöntemi "isEnumType" geçersiz kılmak zorunda yapmak için:

sonraki hata vardı
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 tablo için meta talep ve gelen çeteleler için bir tür VARCHAR alır PostgreSQL. Ancak PostgreSQL bu tipi geri kabul etmeyecektir.

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

Bu OTHER olarak enum ve ebeveyn yöntemiyle super.createDataType(sqlType, sqlTypeName) için türünü ayarlar uygun biçimde DataType oluşturur:

sonraki şekilde PostgresqlDataTypeFactory gelen yöntemler overrode.

PostgreSQL sürümü: 9.6.5
DbUnit sürümü: 2.5.4

fazla bilgi discussion öğrenilmesi mümkündür.