我有一个使用Spring MVC v5.0.8,Java 8的项目
我已经进行了从控制器到数据库的集成测试,现在,我想添加一个集成测试,以测试如果事务行为的第一部分失败了会发生什么。我将确保有效地回滚该交易。
因此,我必须重写DAO以使其失败。经过研究,得出了一个简单的想法:对该测试覆盖spring config:Overriding an Autowired Bean in Unit Tests
我的测试现在可以正常工作,但是问题是此配置与其他类的其他测试共享,即使它属于一个类。我该如何使其特定于该测试?
(如果b创建失败,则必须回滚a) 测试失败:
ProxyPass "/identity" "unix:/var/run/uwsgi/keystone-wsgi-public.socket|uwsgi://uwsgi-uds-keystone-wsgi-public/" retry=0
名义测试用例:
@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
}
}
ApplicationConfiguration(特定于测试)
@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
}
}
注意:我的集成测试类在基本软件包中,这有关系吗?
我找到了一个选择:将失败测试配置放在外部类中,并仅在失败测试中调用它,但仍然不起作用。
目前,我的想法不多了,欢迎您的帮助!
答案 0 :(得分:0)
我建议您使用@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;
答案 1 :(得分:0)
我知道了。以一种不好的方式,所以如果您有更好的选择,我会介入。但是我没有找到一种使数据无法通过测试的方法……那将是更好的选择。
因此,我发现@Configuration批注对类进行了扫描。 Spring doc。
我只是在外部类中进行了失败的配置,并删除了@Configuration批注。因此不会被其他测试配置扫描。然后在失败测试类中,我在@ContextConfiguration批注中引用了它,因此可以使用它。这样,它可以正常工作。我现在遇到@Transactional的问题,但这不是此线程。
感谢响应者,您使我朝着正确的方向看:-)