Autowired repository NPE Spring Boot apllication junit test

293
20 ноября 2017, 17:57

Есть класс

package dev5.lavishek.trains.dao;
import dev5.lavishek.trains.entity.Ticket;
import java.time.LocalDate;
import java.util.List;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface TicketRepository extends CrudRepository<Ticket, Integer> {
  @Query(value = "SELECT ticket "
      + "FROM Ticket ticket "
      + "WHERE ((ticket.train.id =:idTrain) AND (ticket.dateDeparture=:departure))")
  List<Ticket> getTicketsByTrainAndDate(@Param("idTrain") Integer idTrain,
      @Param("departure") LocalDate dateDeparture);
}

Пишу для него тест

package dev5.lavishek.trains.dao;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@DataJpaTest
class TicketRepositoryTest {
  @Autowired
  private TestEntityManager entityManager;
  @Autowired
  private TicketRepository repository;
  @BeforeEach
  void setUp() {
    repository.findAll();
  }
  @AfterEach
  void tearDown() {
  }
  @Test
  void getTicketsByTrainAndDate() {
  }
}

Структура проекта

application.properties

spring.datasource.url=jdbc:h2:file:C:\\Users\\Alexander\\YandexDisk\\NetCracker\\TrainsProject\\database\\database
spring.datasource.username=admin
spring.datasource.password=1234
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect

В классе с тестами @Autowired поле = null ; Вылетает NPE

Также есть вопрос как для тестов сделать отдельный application.properties , чтоб для тестов использовать например базу данных в памяти , а не менять основную.

Answer 1

Вы можете использовать аннотацию @TestPropertySource, чтобы указать на файл с настройками. Можете создать тестовые настройки.

из javadoc:

test property sources can be used to selectively override properties defined in system and application property sources

test property sources может использоваться для выборочного переопределения свойств системы и приложения

Например:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ExampleApplication.class)
@TestPropertySource(locations="classpath:test.properties")
public class ExampleApplicationTests {
}
Answer 2

У тебя там мульти-модульный проект. Сам контекст поднимается в одном модуле (console), а тесты находятся в другом. Чтобы они заработали им нужен какой-то стартовый конфигурационный класс, который поднимет контекст (как-то так...). Поэтому делаем класс TestConfig:

@Configuration
@EnableJpaRepositories
@EnableAutoConfiguration
@EntityScan("dev5.lavishek.trains.entity")
public class TestConfig {
}

И рядом делаем тестовый класс:

@ActiveProfiles("h2")
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestConfig.class)
public class TicketRepositoryTest {
    @Autowired private TicketRepository repo;
    @Before
    public void setUp() throws Exception {
        repo.save(asList(
                new Ticket(LocalDate.now(), 1, null, null, null, null, null),
                new Ticket(LocalDate.now(), 2, null, null, null, null, null))
        );
    }
    @Test
    public void findAllTest() throws Exception {
        assertThat(repo).isNotNull();
        assertThat(repo.findAll()).hasSize(2);
    }
}

@SpringBootTest(classes = TestConfig.class) - эта аннотация говорит какой класс использовать для конфигурации контекста.

Далее, переименовываем твой application.properties в application-nc.properties (чтобы он не мешал) и создаем пустой файл application-h2.properties - это нужно, во-первых, чтобы сказать тесту, что мы хотим использовать профиль "h2" (см. подробнее здесь), а во-вторых, Спринг сам поднимает базу H2 в памяти, если она есть в зависимостях (поэтому файл пустой). (Можешь пропустить этот шаг, если у тебя все заработает без него.)

Чтобы все заработало, в pom.xml модуля service нужно удалить зависимость org.springframework:spring-context - она мешает подняться контексту.

Это что, тестовое от NC?..

READ ALSO
Скачивание из Dropbox API v2 Java SDK

Скачивание из Dropbox API v2 Java SDK

Кто-нибудь может объяснить как скачать текстовый файл из Dropbox API v2В интернете в основном на устаревшую версию Dropbox API v1

232
Вопрос по finalize

Вопрос по finalize

Добрый день, сразу к делу, у меня в приложении куча сцен и каждая сцена - это свой объект, там иерархия своя естественно создано и тд

195
Не запускается меню &ldquo;Debug Main&rdquo; в Android Studio. Что делать?

Не запускается меню “Debug Main” в Android Studio. Что делать?

При запуске меню "Debug Main" в Android Studio 30 выдаёт эту ошибку:

290
Лямбда выражения Java 8 (сортировка String)

Лямбда выражения Java 8 (сортировка String)

В качестве компаратора используйте лямбда-функцию, задающую реализацию методу compare() из интерфейса javautil

202