Java SpringMVC-为一个集成测试重写bean
我有一个使用spring MVC v5.0.8、Java 8的项目Java SpringMVC-为一个集成测试重写bean,java,spring,spring-mvc,Java,Spring,Spring Mvc,我有一个使用spring MVC v5.0.8、Java 8的项目 我已经做了一些从控制器到数据库的集成测试,现在,我想添加一个测试,它将测试如果事务行为的第一部分失败会发生什么。我将确保事务得到有效回滚。 所以,我必须重写DAO以使其失败。经过一些研究之后,我想到了一个简单的想法:覆盖该测试的spring配置: 我的测试现在工作得很好,但问题是这个配置与其他类中的其他测试共享,即使它在一个类中。我怎样才能使它特定于该测试 (如果b创建失败,则必须回滚a) 测试失败: @RunWith(Spri
我已经做了一些从控制器到数据库的集成测试,现在,我想添加一个测试,它将测试如果事务行为的第一部分失败会发生什么。我将确保事务得到有效回滚。
所以,我必须重写DAO以使其失败。经过一些研究之后,我想到了一个简单的想法:覆盖该测试的spring配置:
我的测试现在工作得很好,但问题是这个配置与其他类中的其他测试共享,即使它在一个类中。我怎样才能使它特定于该测试 (如果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
}
}
应用程序配置(特定于测试)
注意:我的集成测试类在基本包中,这有关系吗?我找到了一个选项:将失败测试配置放在一个外部类中,并仅在我的失败测试中调用它,但它仍然不起作用。
现在,我没有主意了,所以我欢迎你的帮助 我建议您使用@Qualifier注释
@Bean
@Qualifier("BDaoTest")
public BDao getBDao() {
return new BDao() {
//Overriding method to make it fail
};
}
@Autowired
@Qualifier("BDaoTest")
BDao bDao;
我让它工作了。如果你有更好的选择,我会加入。但是我没有找到一种方法通过数据让我的测试失败。。。哪个更好。
因此,我发现@Configuration注释使类被扫描
我刚刚在一个外部类中进行了失败配置,并删除了@configuration注释。所以它不会被其他测试配置扫描。然后在我的失败测试类中,我在@ContextConfiguration注释中引用了它,因此使用了它。这样很好用。我现在遇到了@Transactional的问题,但这不是这个线程。
感谢响应者,您让我朝着正确的方向看:-)如果您只在这个测试类@ContextConfiguration注释中指定配置,那么我认为它不会与其他测试类共享?我建议您不要使用引发一些异常的特定数据覆盖dao execute test,或者使用模拟来引发一些异常第二步,谢谢你的时间!如果我做了两个单独的配置,比如说ApplicationConfiguration用于常规测试,ApplicationConfiguration用于此测试,ApplicationConfiguration失败,那么即使我调用@ContextConfiguration(class={ApplicationConfiguration.class,CustomWebAppConfiguration.class}),它们都会得到失败配置(可能是因为@Primary作为Guts所述),即使我调用@ContextConfiguration(class={ApplicationConfiguration.class,CustomWebAppConfiguration.class})对于常规测试。我正在试图找到一种方法,使特定数据抛出一些异常,但这是获取现有ID的唯一方法,但由于它们是通过Dao中的UUID.randomUUID()生成的,我不知道我能做什么。问题是控制器自动连接服务类,自动连接BDao,这就是我需要在测试中替换的自动连线实例。实际上,它们在我的测试类中自动连接以查询数据库,但从技术上讲,我在失败测试中不需要BDao,所以我要删除它。
@Autowired
@Qualifier("BDaoTest")
BDao bDao;