Тест Spring Boot не находит бин из пакета одного уровня - PullRequest
0 голосов
/ 30 января 2019

У меня есть @SpringBootTest аннотированный тестовый класс, который хочет использовать тестовую утилиту:

package org.myproject.server;

// ...

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class ServerITest {

    private @Autowired TestHelperBean helper;

    // ...
}

Это прекрасно работает, если TestHelperBean определен в том же пакете, что и тестовый класс (или в подпакете).

package org.myproject.server;

import org.springframework.stereotype.Component;

@Component
public class TestHelperBean {
    // ...
}

Если я переместу его в одноуровневый пакет, компонент не будет найден:

org.springframework.beans.factory.NoSuchBeanDefinitionException: нет подходящего компонента bean типа 'org.myproject. testutils .TestHelperBean': ожидается как минимум 1 компонент, который считается кандидатом autowire.Аннотации зависимостей: {@ org.springframework.beans.factory.annotation.Autowired (обязательно = true)}

Я полагаю, что сканирование компонентов по умолчанию выглядит только в пакете и подпакетах тестового класса- но есть ли способ переопределить это значение по умолчанию?Я пытался добавить аннотацию @ComponentScan в свой тест, но это, похоже, не дало никакого эффекта:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@ComponentScan("org.myproject")
public class ServerITest {
    // ...
}

Есть ли способ использовать bean-компоненты из пакетов одного уровня в тестах Spring Boot?

Ответы [ 4 ]

0 голосов
/ 05 февраля 2019

Примечание @ComponentScan не работает , если помещено в тестовый класс .

Это можно сделать вместо этого:

  • Добавьте вложенный класс в свой тест и аннотируйте этот класс с помощью @Configuration и аннотации @ComponentScan.
  • Используйте аннотацию @Import в тестовом классе.Обратите внимание, что @Import позволяет только добавлять отдельные классы в контекст.
  • Если вы не против добавить классы из пакета sibling и в других ситуациях, вы также можете поместить аннотацию @ComponentScan в любую@Configuration класс (или @Component, @Service и т. Д.), Который уже включен в контекст.
0 голосов
/ 30 января 2019

С помощью аннотации компонентов можно указать '*', чтобы охватить также все подпакеты в базовом пакете.

@ComponentScan({"org.myproject.*", "org.newproj.*"})

Он охватывает все подпакеты в разделах "org.myproject" и "org.newproj".

Пример структуры пакета

org.myproject 
org.myproject.abc 
org.myproject.abcd 
org.myproject.xyz.abc

org.newproj 
org.newproj.abc 
org.newproj.xyz

ИЛИ

Зарегистрировать компонент с классом Configuration / SpringBootApplication

@Bean
private TestHelperBean helper() {
    return new TestHelperBean();
}
0 голосов
/ 30 января 2019

Другие ответы относительно использования ComponentScan являются правильными.Однако в документации по Spring Boot настоятельно рекомендуется, чтобы "ваш основной класс приложения находился в корневом пакете над другими классами".Из личного опыта могу сказать, что отклонение от этой практики приведет к большему количеству неприятностей, чем оно того стоит.

0 голосов
/ 30 января 2019

В компонентном сканировании вы можете добавить несколько пакетов для проверки

@ComponentScan({"org.myproject","org.myproject. server","org.myproject. sibilings"})
...