如何使用SpringApplicationConfiguration或ContextConfiguration加载较小的应用程序部分

时间:2014-10-14 21:33:25

标签: java spring spring-mvc spring-boot

我正在开发一个基于Spring-boot的项目,这对我来说还是一个新手。目前,我正在使用@WebApplicationContext注释来运行我的任何Junit测试,因为我似乎无法让应用程序以任何其他方式启动。我提出这个问题的目的是要么得到一个明确的答案,如何避免它的使用,或者链接到项目使用适用的概念。

我的确切目标是:我希望测试配置不会加载整个Web应用程序,以便测试较小的服务和子类集。

实施例: 我目前有一系列3个汇编程序。一个用于父对象,另外两个用于与子相关的对象

@Component
public class ReportResponseAssembler {

    @Autowired
    private ParameterResponseAssembler parameterResponseAssembler;

    @Autowired
    private TimeRangeResponseAssembler timeRangeResponseAssembler;

    public ReportResponseAssembler makeResponse() {
        return new ReportResponseAssembler();
    }
}

出于测试目的,我想加载这3个类并让它们适当地将依赖项注入到父类中。类似的东西:

public class ReportResponseAssemblerTest {

    @Autowired
    ReportInstanceResponseAssembler reportResponseAssembler;

    @Test
    public void testPlaceHolder() {
        Assert.assertNotNull(reportResponseAssembler);
    }
}

我尝试了以下几点:

@EnableAutoConfiguration
@ComponentScan(basePackages = { "com.blahpackage.service.assembler" })
@Configuration
public class TestContextConfiguration {}

然后将其提供给SpringApplicationConfiguration,但即使使用扫描,它也不会检测适用于自动注入的bean。也许我需要在配置中直接将它们表示为@Beans并返回新实例?还有其他好方法吗?任何示例项目或解释的链接都会很棒。

谢谢你,任何回复的人,非常适合你的时间。

2 个答案:

答案 0 :(得分:5)

您可以使用以下代码轻松完成您要做的事情:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestContextConfiguration.class)
public class ReportResponseAssemblerTest {

    @Autowired
    ReportInstanceResponseAssembler reportResponseAssembler;

    @Test
    public void testPlaceHolder() {
        Assert.assertNotNull(reportResponseAssembler);
    }
}

@EnableAutoConfiguration
@ComponentScan(basePackages = { "com.blahpackage.service.assembler" })
@Configuration
public class TestContextConfiguration {

}

您提到的三个类需要在com.blahpackage.service.assembler之下,并且还必须使用一些Spring构造型注释进行注释,例如@Component@Service。例如,您将拥有:

@Component
public class ReportResponseAssembler {

    @Autowired
    private ParameterResponseAssembler parameterResponseAssembler;

    @Autowired
    private TimeRangeResponseAssembler timeRangeResponseAssembler;

    public ReportResponseAssembler makeResponse() {
        return new ReportResponseAssembler();
    }
}

@Component
public class ParameterResponseAssembler {
   //whatever
}
然而,我会建议你很少使用这样的测试,因为它会影响性能。我的意思是,如果你有很多这些类型的测试,Spring需要为每个测试创建和销毁不同的应用程序上下文,而如果你使用相同的上下文和测试,Spring可以(通常)缓存上下文。查看this博客文章了解更多详情

答案 1 :(得分:2)

我建议不要创建测试配置。您的集成测试(希望您知道单元测试根本不应该创建Spring上下文)将测试未在生产中使用的配置。

我建议为每个包/模块/集成测试单元创建Spring配置。您可以通过@Import注释将这些配置导入其他上下文。

每个包的方法有很大的优势,你可以指定包私有(使用默认访问修饰符)bean

@Component
class SomeBeanClass{
}

这些只能由来自同一包的bean自动装配。这是如何封装Spring bean的方便方法。

这种颗粒状的Spring配置可以通过单独的集成测试轻松测试。