![](/img/trans.png)
[英]How to override Spring Bean in integration test with custom bean definition?
[英]Spring MVC - Override a bean for one Integration test
我有一个使用Spring MVC v5.0.8,Java 8的项目
我已经进行了从控制器到数据库的集成测试,现在,我想添加一个集成测试,以测试如果事务行为的第一部分失败了会发生什么。 我将确保该事务得到有效回滚。
因此,我必须重写DAO以使其失败。 经过一些研究,提出了一个简单的想法:对该测试覆盖spring config: 在单元测试中覆盖Autowired Bean
我的测试现在可以正常工作,但是问题是此配置与其他类的其他测试共享,即使它属于一个类。 我该如何使其特定于该测试?
(如果b创建失败,则必须回滚a)测试失败:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@EnableWebMvc
@Sql({"/sqlfiles/clean-data.sql"})
public class AControllerFailDaoIt {
@Configuration
static class ConfigFailDao extends ApplicationConfiguration{
@Bean
@Primary
public BDao getBDao() {
return new BDao() {
//Overriding method to make it fail
};
}
}
@Autowired
AController aController;
@Autowired
ADao aDao;
@Test
public void should_not_create_a_if_b_failed(){
//creation of a
//assert nor a nor b are created
}
}
标称测试用例:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@EnableWebMvc
@ContextConfiguration(classes = {ApplicationConfiguration.class, CustomWebAppConfiguration.class})
@Sql({"/sqlfiles/clean-data.sql"}) //"/sqlfiles/account-test.sql"
public class AControllerIT {
@Autowired
AController aController;
@Autowired
ADao aDao;
@Autowired
BDao bDao;
@Test
public void should_create_a_and_corresponding_b(){
//create a
//assert that both a and b are created
}
}
ApplicationConfiguration(特定于测试)
@Configuration
@ComponentScan(basePackages = "my.base.package")
class ApplicationConfiguration implements WebMvcConfigurer {
}
注意:我的集成测试类在基本软件包中,这有关系吗?
我找到了一个选择:将失败测试配置放在一个外部类中,并仅在失败测试中调用它,但是它仍然不起作用。
目前,我没有任何想法,欢迎您的帮助!
我建议您使用@Qualifier批注。
不在您的配置中将@Primary放在getBDao()方法之上,而是将@Qualifier带有一些名称,即:
@Bean @Qualifier("BDaoTest") public BDao getBDao() { return new BDao() { //Overriding method to make it fail }; }
之后,将@Primary放在默认的BDao实现中(在默认配置中)。
然后,当您在测试中自动装配该bean时,您需要放置以下限定符:
@Autowired @Qualifier("BDaoTest") BDao bDao;
我知道了 以一种不好的方式,所以,如果您有更好的选择,我会介入。但是我没有找到一种使数据无法通过测试的方法……那将是更好的选择。
因此,我发现@Configuration批注对类进行了扫描。 春季文件 。
我只是在外部类中进行了失败的配置,并删除了@Configuration批注。 因此不会被其他测试配置扫描。 然后在失败测试类中,我在@ContextConfiguration批注中引用了它,因此可以使用它。 这样,它可以正常工作。 我现在有@Transactional的问题,但这不是此线程。
感谢响应者,您使我朝着正确的方向看:-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.