@ContextConfiguration с SpringExtension не обнаруживает явно определенный @Bean - PullRequest
0 голосов
/ 06 февраля 2019

Я использую JUnit5 с SpringExtension.Но по какой-то причине первый тест проходит успешно, в то время как второй не проходит

Может кто-нибудь сказать мне, почему это не удается?

package com.acme;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;

import static org.assertj.core.api.Assertions.assertThat;

@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = ConfigurationTest.Config.class)
public class ConfigurationTest {
  @Test
  void explicitContextTest() {
    AnnotationConfigApplicationContext applicationContext =
        new AnnotationConfigApplicationContext(Config.class);
    assertThat(applicationContext.getBean(Skeleton.class)).isNotNull();
  }

  @Test
  void contextConfigInjectionTest(Skeleton skeleton) {
    assertThat(skeleton).isNotNull();
  }

  @Configuration
  static class Config {
    @Bean
    Skeleton skeleton() {
      return new SkeletonImpl();
    }
  }

  interface Skeleton {
  }

  static class SkeletonImpl implements Skeleton {
  }
}

PS: Если я добавлю @ComponentScan на Config уровне класса,Второй тест также удастся.Вопрос скорее в том, почему весенний тест не может обнаружить явно определенные бины, если я не прошу его сканировать явно

1 Ответ

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

Похоже, я должен указать @Autowired для тестового параметра для расширения пружины, чтобы включить

Я только что попробовал.Это работает

package com.acme;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;

import static org.assertj.core.api.Assertions.assertThat;

@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = ConfigurationTest.Config.class)
public class ConfigurationTest {
  @Test
  void explicitContextTest() {
    AnnotationConfigApplicationContext applicationContext =
        new AnnotationConfigApplicationContext(Config.class);
    assertThat(applicationContext.getBean(Skeleton.class)).isNotNull();
  }

  @Test
  void contextConfigInjectionTest(@Autowired Skeleton skeleton) {
    assertThat(skeleton).isNotNull();
  }

  @Configuration
  static class Config {
    @Bean
    Skeleton skeleton() {
      return new SkeletonImpl();
    }
  }

  interface Skeleton {
  }

  static class SkeletonImpl implements Skeleton {
  }
}

В соответствии с реализацией расширения Spring, Spring ожидает либо @Autowired / @Qualifier / @Value.Только тогда пружина разрешит параметры теста по ApplicationContext.Иначе, это просто не разрешает

Ссылка: https://github.com/spring-projects/spring-framework/blob/0ad9349d84a725dc37499bcb0ed2aad0de770c73/spring-test/src/main/java/org/springframework/test/context/junit/jupiter/SpringExtension.java#L156-L163

...