2010-02-14 4 views
2

Я работаю со многими классами, которые аннотируются с помощью javax.persistence.Entity и т. П. Мой проект заключается в создании метаданных о JPA-аннотированных классах, а не настойчивости, поэтому я использую их в качестве тестовых примеров.Самый простой способ программной проверки того, что класс имеет действительную деинсталляцию JPA

Вместо того, чтобы запускать Hibernate или какой-либо другой поставщик JPA, я хотел бы программно проверить - часть моих модульных тестов - что мои заявления JPA действительно действительны.

Что это самый простой способ сделать это?

ответ

4

Просто создать простейшую SessionFactory или любой другой EclipseLink или OpenJPA обеспечить за EntityManagerFactory и пусть они проверяют его (используя некоторую фиктивную базу данных в памяти, если необходимо). Это слишком сложно, чтобы изобретать его.

Для Hibernate это может быть сделано с помощью Configuration.buildMappings:

@RunWith(Theories.class) 
public class EntitiesAreValidTest { 

    @DataPoints 
    public static Class<?>[] entities = new Class[] { 
     SimpleEntity.class, 
     SimpleEntityWithTransientField.class, 
     TwoFieldEntity.class 
    }; 

    @Theory 
    public void classHasValidConfiguration(Class<?> entityClass) { 

     new AnnotationConfiguration().addAnnotatedClass(entityClass).buildMappings(); 
    } 
} 
0

Я не уверен, если есть более простой способ, но вы можете использовать отражение для доступа к аннотации класса

Class class = Example.class; 
Annotation[] annotations = class.getAnnotations(); 
+1

Это была бы легкая часть. Проверка достоверности всех аннотаций является трудной. – whiskeysierra

+0

Я согласен с @Willi. Я хочу проверить их использование, но опасаюсь накладных расходов на запуск провайдера для моих модульных тестов. –

1

Что плохого об использовании конкретного JPA-провайдера в тестах? В сочетании со встроенной базой данных (например, Apache Derby) вы можете повторно использовать логику, которая уже была реализована. Другая идея - проверить источники EclipseLink, Hibernate, OpenJPA, ..., чтобы узнать, можете ли вы их напрямую использовать.

+0

Скопировано в основном - я хочу, чтобы мои модульные тесты были быстрыми. Запуск Hibernate может быть дорогостоящим. –

+0

Мои модульные тесты обычно выполняются на сервере сборки, поэтому производительность не является проблемой. Уже считается TeamCity или что-то похожее? – whiskeysierra

+1

@Wili Speed ​​- это проблема в какой-то момент, даже когда тест выполняется на сервере CI. –

0

Если вы не доверяете поставщикам JPA (или не хотите использовать их), а затем попытаться согласовать JPA аннотации (метаданные) извлекаются с помощью отражения с метаданными JDBC найденного с помощью ResultSetMetaData (например, см here).

Я не имею в виду, что это просто, но с правильным подходом вы должны иметь довольно компактный набор вспомогательных методов для проверки базовых определений для каждого объекта. И пробег может варьироваться в зависимости от того, сколько функций JPA вы хотите покрыть.