2016-08-23 4 views
0

Как я могу проверить запрос HQL с помощью тестов JUnit?Тестирование HQL с Junit

Я сопоставляются Entity Класс:

@Entity 
@Table(name = "DOE") 
public DomainObjectEntity { 
    //some attributes 
} 

, который представляет объекты домена:

public class DomainObject { 
    //some attributes 
} 

У меня также есть интерфейс хранилища для моих доменных объектов:

public interface DomainObjectRepository { 

    /** 
    * Gets entity by some attribute 
    * 
    */ 
    DomainObject getDomainObjectByObjectId(String objectId); 
} 

этот интерфейс реализован в

@Repository 
public class DomainObjectRepositoryImpl implements DomainObjectRepository { 

    @Inject 
    private DomainObjectEntityJPARepository entityRepository; 

    @Override 
    public DomainObjectgetDomainObjectById(String parcelId) { 
     //this converts my entity to domain object 
     return entityRepository.findByDomainObjectId(DomainObjectId.getStr()).getDomainObject(); 
    } 

} 

мой JPA Entity хранилище выглядит следующим образом:

public interface DomainObjectEntityJPARepository extends JpaRepository<DomainObjectEntity, String> { 
    /** 
    * get DomainObject with requested id 
    * 
    * @param objectId - objects id 
    * @return DomainObject 
    */ 
    @Query("some query to be tested") 
    DomainObjectEntity findByDomainObjectId(@Param("objectId") String objectId); 
} 

и, наконец, я хочу написать простой тест JUnit, чтобы проверить, если запрос на findByDomainObjectId возвращает правильный объект. Я думаю, что мой тест должен выглядеть следующим образом:

  1. создать объект поместить в БД
  2. получить объект из БД
  3. сравнения объектов

Как я могу написать такой тест?

Любые хорошие примеры тестирования запроса HQL с помощью junit и репозиториев?

+0

Я думаю, что это можно решить с помощью mockito – SpringLearner

+0

@SpringLearner у меня была эта идея, но если бы я издевался над '' findByDomainObjectId'', этот тест не был бы бессмысленным, поскольку он не тестировал бы querry? –

+0

, если вы хотите проверить точный запрос, вам нужно попасть в базу данных. В общем модульном тестировании мы даем некоторый результат и выполняем его. Аналогично, вы также можете тестировать с помощью mock-объектов. – SpringLearner

ответ

1

Если вы хотите протестировать, если ваш метод вернет правильный объект, просто издевайтесь над вашим сущ. Или другим, что вы используете для запроса своей БД с помощью mockito.

Если вы хотите проверить, работает ли ваш запрос, вы должны установить тестовую БД (в большинстве случаев используется БД памяти в большинстве случаев) с той же схемой и простыми тестовыми данными уже в БД. В вашем методе тестирования вы должны вызывать только метод с известным идентификатором и проверять, есть ли у вас правильный объект. H2 прост в использовании для тестирования в памяти, и вы можете использовать скрипт create.sql (если он есть) и скрипт insert.sql, где вы определяете свои известные тестовые данные.

Это важный аспект модульного тестирования только для проверки одной части вашей программы за раз. если вы вставляете в БД в свой тест, вы также проверите аспект вставки, а не только аспект чтения.

+0

, поэтому, если я правильно понимаю, нет фактической точки для тестовых квестов junit, если они проверены вручную в тестовой базе данных? –

+0

, поскольку вы, кажется, используете JPA, не будет иметь большого смысла использовать предопределенные запросы, такие как find, поскольку он известен для работы. в прекрасно разработанной программе вы все равно ее испытаете. – LuckAss

+0

, но на самом деле вы должны подключить свою программу к тестовой БД в своих модульных тестах, чтобы вы могли запускать свою программу по данным, которые вы знаете, и если что-то пойдет не так, фактические данные не будут уничтожены. вы можете использовать JPA для создания вашей схемы в тестовой БД, если вы используете весну, вы можете использовать [EmbeddedDatabaseFactory] (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework /jdbc/datasource/embedded/EmbeddedDatabaseFactory.html), чтобы получить простую тестовую базу данных. – LuckAss

0

Вам просто нужно использовать тестовый db, например H2, который находится в памяти db, а затем использовать Junit для просмотра возвращаемого объекта.

Смежные вопросы