Как проверить запрос только для чтения jpa? - PullRequest
0 голосов
/ 05 марта 2019

Модель упрощена для вопроса.

У меня есть эта сущность:

@Entity
public class Formation {
    @Id
    Long id;
    String login;
    String code;
    String level;
    // geters and Setters

С этим хранилищем:

public interface FormationRepository extends JpaRepository<Formation, Long> {

@Query(value = "SELECT UNIQUE l.id, l.login, d.code,d.level\n" 
        "   FROM          table_login l,\n" +
        "                 table_diploma d,\n" +
        "   WHERE         
        "                 l.fhab_key = d.fhab_key\n" +
        "   AND           l.login= :login", nativeQuery = true)
List<Formation> findAllByLogin(@Param("login")String login);

Пока все хорошо, этоработает.

Теперь я хочу добавить тест для репозитория (с и h2database).Но я не могу сохранить данные, так как сущность не отображается в одну таблицу.

Так что это не сработает:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class FormationRepositoryTest {
    @Autowired
    FormationRepository formationRepository;

    @Test
    public void communeRepositoryTest() {
        Formation formation = new Formation();
        formation.setId(123L);
        formation.setDlog_login("123");
        formationRepository.save(formation); // ok
        formationRepository.findAllByLogin("123"); // ko -> Caused by: Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: scolarite.scol_droit_login is not mapped
    }
}

Здесь мне нужно добавить, что яне хочу, чтобы в моем приложении были файлы sql.

Так, каково было бы здесь решение?

Изменить мою модель, чтобы создать сущность за таблицей?(на самом деле, мой запрос использует 8 внутренних соединений, поэтому все это будет довольно долго кодировать ...)

Другое решение?

1 Ответ

0 голосов
/ 05 марта 2019

Если вы не хотите создавать сущности для всех ваших таблиц, вы можете предварительно заполнить тестовую базу данных H2, определив schema.sql и data.sql в вашем пути к классам.

  • schema.sql будет содержать операторы DDL для создания всех задействованных таблиц (вы упомянули 8 таблиц).
  • data.sql будет содержать операторы вставки, необходимые для того, чтобы пользовательский sql возвратил login = 123.

Вы можете найти пример здесь .

Тогда ваш тестовый код будеткак:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class FormationRepositoryTest {
    @Autowired
    FormationRepository formationRepository;

    @Test
    public void communeRepositoryTest() {
        List<Formation> formations =  formationRepository.findAllByLogin("123"); 
        Assert.assertEquals(formations.size(), 1); 
    }
}
...