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

我正在开发一个基于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并返回新实例?还有其他好方法吗?您拥有的示例项目或解释的任何链接都将非常出色.

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


最佳答案

您可以使用以下代码轻松完成您要执行的操作:


@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博客文章了解更多详情