繁体   English   中英

Spring MVC-为一个集成测试覆盖bean

[英]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批注。

  1. 不在您的配置中将@Primary放在getBDao()方法之上,而是将@Qualifier带有一些名称,即:

     @Bean @Qualifier("BDaoTest") public BDao getBDao() { return new BDao() { //Overriding method to make it fail }; } 
  2. 之后,将@Primary放在默认的BDao实现中(在默认配置中)。

  3. 然后,当您在测试中自动装配该bean时,您需要放置以下限定符:

     @Autowired @Qualifier("BDaoTest") BDao bDao; 

我知道了 以一种不好的方式,所以,如果您有更好的选择,我会介入。但是我没有找到一种使数据无法通过测试的方法……那将是更好的选择。
因此,我发现@Configuration批注对类进行了扫描。 春季文件
我只是在外部类中进行了失败的配置,并删除了@Configuration批注。 因此不会被其他测试配置扫描。 然后在失败测试类中,我在@ContextConfiguration批注中引用了它,因此可以使用它。 这样,它可以正常工作。 我现在有@Transactional的问题,但这不是此线程。
感谢响应者,您使我朝着正确的方向看:-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM