我正在开发一个基于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博客文章了解更多详情