Тест с аннотацией @DataJpaTest, а не с автопроводкой, с аннотацией @Autowired - PullRequest
3 голосов
/ 31 октября 2019

У меня есть приложение Spring Boot, которое содержит репозиторий Spring Data Jpa. Мне нужно запустить модульный (или компонентный) тест вокруг этого хранилища. У меня нет большого опыта работы с Spring Data Jpa.

Вот мой тест. Это тривиально просто, и я не могу заставить его пройти.

import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import static org.junit.Assert.assertNotNull;

@DataJpaTest
public class FooRepositoryTest {

    @Autowired
    private FooRepository fooRepo;

    @Test
    public void notNull(){
        assertNotNull(fooRepo);
    }
}

Вот другой соответствующий исходный код.

import com.fedex.dockmaintenancetool.webservice.types.Foo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface FooRepository extends JpaRepository<Foo, Long> {
}

и

import javax.persistence.Entity;

@Entity
public class Foo {
}

Я просто пытаюсь подключить репо Jpa в тестовом режиме, а я не могу. Очевидно, я неправильно понимаю небольшой нюанс работы Spring Boot. Но даже пройдя некоторые уроки, я не могу понять, чего мне не хватает. Может ли кто-нибудь помочь мне с этим?

Ответы [ 2 ]

2 голосов
/ 31 октября 2019

Вам не хватает аннотации @RunWith(SpringRunner.class), которая сообщает JUnit о фактическом запуске приложения Spring для теста.

Ваш тестовый класс должен выглядеть как

import org.junit.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.test.context.junit4.SpringRunner;
import static org.junit.Assert.assertNotNull;

@RunWith(SpringRunner.class)
@DataJpaTest
public class FooRepositoryTest {

    @Autowired
    private FooRepository fooRepo;

    @Test
    public void notNull(){
        assertNotNull(fooRepo);
    }
}

Используемая версия JUnitвопрос все еще в JUnit 4. Spring Boot 2.2.0 переключается на JUnit5.

С JUnit5 вам придется использовать @ExtendWith(SpringExtension.class) вместо @RunWith(SpringRunner.class).

1 голос
/ 31 октября 2019

Когда вы используете аннотацию @DataJpaTest, это означает, что вы пытаетесь протестировать только слой репозитория. Аннотация используется для тестирования репозиториев JPA и в сочетании с @RunWith(SpringRunner.class) для включения заполнения контекста приложения. Аннотация @DataJpaTest отключает полную автоконфигурацию и применяет только конфигурацию, относящуюся к тестам JPA. Так как @fap siggested использует ее как:

@RunWith(SpringRunner.class)
@DataJpaTest
public class FooRepositoryTest {

    @Autowired
    private FooRepository fooRepo;

    @Test
    public void notNull(){
        assertNotNull(fooRepo);
    }
}

Когда вы используете аннотацию @RunWith(SpringRunner.class), SpringRunner предоставляет поддержку длязагрузка Spring ApplicationContext и наличие bean-компонентов @Autowired в вашем тестовом экземпляре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...