Тест загрузки Spring - нет подходящего bean-компонента типа com.example.MyService.

По stackoverflow есть ряд аналогичных вопросов, но я не нашел ни одного из них.

В моем интеграционном тесте с загрузкой Spring 2.0.2.RELEASE я создал отдельный класс @Configuration для теста, в котором я определил bean com.example.MyService. Этот bean-компонент используется каким-то другим bean-компонентом в com.example.OtherBean.

Вот код:

Тестовый класс:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {MyIntegrationTestConfig.class},
        webEnvironment = SpringBootTest.WebEnvironment.MOCK)
public class MyService1Test extends MyAbstractServiceIntegrationTest {
@Test
    public void someTest() {}
}

Общая аннотация для настройки и разборки:

public class MyAbstractServiceIntegrationTest{
    @Before
    public void setUp(){}

    @After
    public void tearDown()
}

MyIntegrationTestConfig в src / test, который будет использоваться вместо конфигураций в src / main:

@Configuration
@ComponentScan({"com.example"})
public class MyIntegrationTestConfig {
   @Bean
   public MyService myService() {
      return null;
   }
}

MyService bean может иметь значение null для целей тестирования.

Когда я запускаю тест, я получаю следующую ошибку:

Нет подходящего bean-компонента типа com.example.MyService: ожидается как минимум 1 bean-компонент, который квалифицируется как кандидат autowire. Аннотации зависимостей: {}

Я даже пробовал добавить этот внутренний класс в MyServic1Test. Все еще не помогло:

@TestConfiguration
static class MyServic1TestContextConfiguration {

    @Bean(name = "MyService")
    public MyService myService() {
        return null;
    }
}

Есть идеи, что я здесь сделал не так? Или я что-то упустил?

Я подозреваю, что Spring сначала пытается создать bean-компонент / autowire в папке src / main, прежде чем он даже создаст bean-компонент MyService, определенный в папке src / test. Может ли быть так? Или существует другой контекст (например, тестовый контекст), в котором находится компонент MyService, в то время как другие компоненты находятся в другом контексте и не могут найти MyService.

Дополнительный вопрос: для интеграционного теста можно использовать webEnvironment = SpringBootTest.WebEnvironment.MOCK, верно?


person Simo    schedule 29.05.2018    source источник
comment
Попробуйте вернуть new MyService() вместо null, чтобы проверить, сохраняется ли ошибка.   -  person NiVeR    schedule 30.05.2018
comment
Ха, @NiVeR. ошибка вроде исчезла. Теперь я сталкиваюсь с кучей бобов, чтобы сделать это. Вопрос: Могу ли я использовать @ MockBean внутри класса @ Configuration MyIntegrationTestConfig? Я пробовал, вроде нормально, но не уверен, правильно ли это делать внутри класса конфигурации.   -  person Simo    schedule 30.05.2018
comment
Так что, возможно, последний вопрос: почему Spring boot не рассматривает null как bean-компонент? Просто искал, но не нашел для этого никаких документов.   -  person Simo    schedule 30.05.2018
comment
На последний вопрос есть хороший ответ: stackoverflow.com/questions/2707322/what-is- null-in-java.   -  person NiVeR    schedule 30.05.2018
comment
@Simo, ваш вопрос включает в себя хороший код! +1   -  person biniam    schedule 02.11.2018


Ответы (1)


Проблема в том, как вы инициализируете bean-компонент. Значение null - это то, что вызывает проблему. Это как если бы вы фактически не объявляли какой-либо экземпляр этого объекта. Чтобы заставить его работать, объявите действующий экземпляр службы new MyService().

person NiVeR    schedule 29.05.2018