Есть класс
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 , чтоб для тестов использовать например базу данных в памяти , а не менять основную.
Вы можете использовать аннотацию @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 {
}
У тебя там мульти-модульный проект. Сам контекст поднимается в одном модуле (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?..
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости