Я использую базу данных H2 для своих модульных тестов.В моем приложении у меня есть объект Entity с именем FooXml
, определенный следующим образом:
@Entity
@Table(name = "T_FOOXML")
@SequenceGenerator(allocationSize = 1, name = "S_FOOXML", sequenceName = "S_FOOXML")
@NamedQueries( ... )
@Cache(usage = CacheConcurrencyStrategy.NONE)
public class FooXml implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "S_FOOXML")
@Column(name = "FOOXML_ID")
private Integer id;
@Type(type = "my.app.common.HibernateXMLType")
@Column(name = "FOOXML_CONTENT")
@Basic(fetch = FetchType.LAZY)
private String xmlContent;
...
}
Поэтому для чтения / записи содержимого XML из базы данных я создал собственный XMLType, my.app.common.HibernateXMLType
, который реализует org.hibernate.usertype.UserType
.Здесь определены методы nullSafeSet
и nullSafeGet
.
Теперь я хочу использовать базу данных H2 в памяти для своих тестов, и некоторые тесты используют этот класс FooXml
.Поскольку H2 не поддерживает Oracle XmlType
, я должен настроить свой my.app.common.HibernateXMLType
.Например, я добавил эту часть:
public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
...
// Case where H2 Database is used as the dataSource...
if (st.getConnection() instanceof org.h2.jdbc.JdbcConnection) {
// Set the XML as a String...
st.setObject(index, (String) value);
} else {
// Case of "normal" behavior (outside tests context)
...
}
}
У меня есть несколько проблем с этим подходом:
- Я добавляю код, который напрямую связан с целью тестирования в производственном кодеapplication (т. е. , а не в тестовом коде);
- Поскольку этот класс зависит от
org.h2.jdbc.JdbcConnection
, я должен добавить зависимость h2-database в моем пакете WAR.
Вопросы :
- Это лучший подход для решения моей проблемы или есть лучший способ сделать это?
- Есть лиспособ сказать Hibernate использовать другой тип (
my.app.common.HibernateXMLTypeForH2
вместо my.app.common.HibernateXMLType
) для целей тестирования?
ps: скрипт для создания моей таблицы в базе данных H2 выглядит следующим образом:
create table T_FOO_XML (
FOOXML_ID NUMBER(9, 0) not null,
FOOXML_CONTENT CLOB(400000)
);
Технические подробности : База данных H2 v1.3.153, JUnit 4.8.1, Java 1.6,Hibernate 3.2.2, Oracle 10g используется в средах без тестирования .