通过代码进行Spring配置与通过注释进行Spring配置

时间:2018-09-09 10:12:41

标签: spring-annotations applicationcontext spring-bean spring-config springjunit4classrunner

我通过如下代码创建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不会自动连接,配置中的bean也是如此。你能说我可能做错了吗?

为什么我要从代码切换到注释:我希望能够从配置中自动装配bean。现在(以上下文创建的代码方式),我应该在测试方法中编写类似appContext.getBean("jdbcTemplate", JdbcTemplate.class)的内容。如果我能写

@Autowired
private JdbcTemplate jdbcTemplate;

这将起作用:)

1 个答案:

答案 0 :(得分:1)

似乎您正在同时使用两个版本的JUnit:JUnit 4和JUnit 5。 (或同时使用JUnit4 api和JUnit5 api)

注释@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。