Java SpringMVC-为一个集成测试重写bean

Java SpringMVC-为一个集成测试重写bean,java,spring,spring-mvc,Java,Spring,Spring Mvc,我有一个使用spring MVC v5.0.8、Java 8的项目 我已经做了一些从控制器到数据库的集成测试,现在,我想添加一个测试,它将测试如果事务行为的第一部分失败会发生什么。我将确保事务得到有效回滚。 所以,我必须重写DAO以使其失败。经过一些研究之后,我想到了一个简单的想法:覆盖该测试的spring配置: 我的测试现在工作得很好,但问题是这个配置与其他类中的其他测试共享,即使它在一个类中。我怎样才能使它特定于该测试 (如果b创建失败,则必须回滚a) 测试失败: @RunWith(Spri

我有一个使用spring MVC v5.0.8、Java 8的项目
我已经做了一些从控制器到数据库的集成测试,现在,我想添加一个测试,它将测试如果事务行为的第一部分失败会发生什么。我将确保事务得到有效回滚。
所以,我必须重写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注释

  • 在配置中将@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的问题,但这不是这个线程。

    感谢响应者,您让我朝着正确的方向看:-)

    如果您只在这个测试类@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;