Конфигурация Spring с помощью кода или конфигурация с помощью аннотаций - PullRequest
0 голосов
/ 09 сентября 2018

Я создаю Spring ApplicationContext с помощью кода, подобного следующему:

public static AnnotationConfigWebApplicationContext startContext(String activeProfile,
                              PropertySource<?> propertySource, Class<?>... configs) {
    AnnotationConfigWebApplicationContext result = new AnnotationConfigWebApplicationContext();
    if (propertySource != null) {
        result.getEnvironment().getPropertySources().addLast(propertySource);
    }
    if (activeProfile != null) {
        result.getEnvironment().setActiveProfiles(activeProfile);
    }
    result.register(configs);
    result.refresh();
    return result;
}

В тестовом классе я называю это так:

@RunWith(SpringJUnit4ClassRunner.class)
class FunctionalTest {
    private ApplicationContext appContext;

    @BeforeEach
    void init() {
        appContext = Utils.startContext("functionalTest", getPropertySource(), 
                            BaseConfig.class, MyApplication.class, StorageTestConfig.class);
    }
}

Работает нормально, без проблем.

Теперь я пытаюсь сделать то же самое, но с помощью аннотаций:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {BaseConfig.class, MyApplication.class, StorageTestConfig.class}, 
                      loader = AnnotationConfigContextLoader.class)
@ActiveProfiles("functionalTest")
@PropertySource(value = "classpath:test-context.properties")
class FunctionalTest {
      @Autowired
      private ApplicationContext applicationContext;
      ...
}

И это вообще не работает. applicationContext не подключается автоматически, бины из конфигурацийтоже.Можете ли вы сказать мне, что, возможно, я делаю неправильно?

Почему я хочу переключиться с кода на аннотации: я хочу иметь возможность автоматически связывать бины из конфигов.Теперь (в кодовом виде создания контекста) я должен написать что-то вроде appContext.getBean("jdbcTemplate", JdbcTemplate.class) в тестовых методах.Будет здорово, если я смогу написать

@Autowired
private JdbcTemplate jdbcTemplate;

, и это будет работать :) 1021 *

1 Ответ

0 голосов
/ 09 сентября 2018

Кажется, вы используете две версии JUnit одновременно: JUnit 4 и JUnit 5. (или используйте API JUnit4 и API JUnit5 одновременно)

Откуда берется аннотация @Test в вашем FunctionalTest?

Это org.junit.Test? Или это org.junit.jupiter.api.Test?

Кажется, это из org.junit.jupiter.api.Test.

Тогда вам следует использовать @ExtendWith(SpringExtension.class вместо @RunWith(SpringJUnit4ClassRunner.class):

@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {BaseConfig.class, Utils.ServConfig.class, Utils.MvcConfig.class, MyApplication.class, StorageTestConfig.class}, 
                  loader = AnnotationConfigContextLoader.class)
@ActiveProfiles("functionalTest")
@PropertySource(value = "classpath:test-context.properties")
class FunctionalTest {
      @Autowired
      private ApplicationContext applicationContext;

}

Обратите внимание, что SpringExtension доступна с версии 5.0. Если вы используете более низкую версию, вы должны использовать JUnit4, пометьте методы тестирования как org.junit.Test

В тестовом классе я называю это так: Работает нормально, без проблем.

@RunWith(SpringJUnit4ClassRunner.class) здесь ничего не стоит. Вы запускаете этот тест, используя JUnit5. @RunWith не учитывается. Но @BeforeEach считается. Следовательно, это работает.

В ваших FunctionalTest аннотации не учитываются, поэтому она не работает. Используйте JUnit4 (@org.junit.Test, @RunWith) или JUnit5 (@org.junit.jupiter.api.Test, @ExtendWith).

Похоже, вы используете две версии JUnit одновременно: JUnit 4 и JUnit 5.

Если вы не переходите с JUnit4 на JUnit 5, рассмотрите возможность использования только одной версии JUnit.

...