我正在开发一个基于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并返回新实例?还有其他好方法吗?任何示例项目或解释的链接都会很棒。
谢谢你,任何回复的人,非常适合你的时间。
答案 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配置可以通过单独的集成测试轻松测试。