Как мне загрузить SpringCon ApplicationContext без xml для юнит-тестов? - PullRequest
0 голосов
/ 20 января 2020

У меня есть такой тестовый модуль:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserTest {

    @Autowired
    UserRepository userRepository;

    @Test
    public void createTest() throws Exception {

         //... blah blah blah

Это не удалось, потому что я не могу загрузить userRepository с помощью @Autowired:

Failed to load ApplicationContext
java.lang.IllegalStateException: Failed to load ApplicationContext

Я надеваю не имеет applicationContext.xml как , это предполагает .

Моя структура проекта выглядит примерно так:

.
├── main
│   ├── java
│   │   └── com
│   │       └── foo
│   │           └── bar
│   │               ├── Main.java
│   │               ├── models
│   │               │   └── User.java
│   │               └── repositories
│   │                   └── UserRepository.java
│   └── resources
│       ├── application.yaml
│       ├── public
│       └── templates
└── test
    └── java
        └── com
            └── foo
                └── bar
                    └── models
                        └── UserTest.java

В этом проекте интенсивно используются аннотации. В моем классе Main у меня есть что-то вроде этого:

@SpringBootApplication
@PropertySources({
        @PropertySource("classpath:application.yaml"),
})
@EnableJpaRepositories(basePackageClasses = {
        UserRepository.class,
})
public class Main {

    public static void main(final String[] args) throws Exception {
        SpringApplication.run(App.class, args);
    }

}

Я использую Gradle и у меня есть следующие тестовые зависимости:

testImplementation 'junit:junit:4.13'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
testImplementation 'org.hamcrest:java-hamcrest:2.0.0.0'

Вопрос:

Может кто-нибудь объяснить мне, что происходит и каковы возможные причины и решения для чего-то подобного?

1 Ответ

0 голосов
/ 23 января 2020

Вы должны указать компоненты, которые обеспечат реализацию интерфейса. В вашем случае вы можете сделать что-то вроде этого:

@RunWith(SpringRunner.class)
@SpringBootTest(classes={Main.class})
public class UserTest {
....}

Или

создать класс конфигурации в источниках тестирования, как показано ниже

@Configuration
@EnableJpaRepositories(basePackageClasses = {
        UserRepository.class,
})
public class PersistenceConfiguration {
}

Скорее всего, вам нужно создать класс конфигурации, как показано ниже:

@Configuration
@@EntityScan(basePackage={"packages.where.you.put.your.entity.classes"})
public class EntityConfiguration {}

, после этого используйте этот класс в тесте, как показано ниже:

@RunWith(SpringRunner.class)
@SpringBootTest(classes={PersistenceConfiguration.class, EntityConfiguraiton.class})
public class UserTest {
 ....}
...