我有许多不同的 SpringBoot 测试正在运行。到目前为止,自动配置切片非常有用,尤其是与@MockBean
结合使用时。
但是在我目前的测试中,没有这样的切片适合,并且使用@SpringBootTest
启动整个上下文太慢了。
有没有办法手动设置对象树的尖端以启动,然后从那里自动连接所有需要的 bean?或者有没有办法手动设置所有需要的豆子?
在我的特定情况下,我想测试一个 MapStruct 生成的映射器(使用 componentModel = "spring"
),该映射器使用另外两个映射器,每个映射器都注入一个服务来完成它们的工作。
服务通过@MockBean
提供:
@RunWith(SpringRunner.class)
@SpringBootTest
public class ProductResponsibleUnitMapperTest {
@Autowired
private PRUMapper mapper;
@MockBean
private TradingPartnerService tradingPartnerService;
@MockBean
private ProductHierarchyService productHierarchyService;
@Test
public void mapForthAndBack(){
//works but takes ages to boot
}
}
我无法在映射器(对于服务)上使用构造函数注入,因为 MapStruct 不会生成正确的实现。
如何获得仅包含所需豆子的 Spring-Context?
我通过显式声明所有使用的实现找到了一种方法:
@SpringBootTest(classes = {ProductResponsibleUnitMapperImpl.class, LegalEntityMapperImpl.class, ProductHierarchyMapperImpl.class})
对于更复杂的设置,声明生成的类将很麻烦且危险。
我仍在寻找一种更好更清洁的方式来让 Spring 决定需要什么课程。应该可以设置手头的类,让 Spring 决定需要哪些类并被实例化。