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

时间:2018-08-25 17:28:29

标签: java spring spring-mvc

我有一个使用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
    }
}

注意:我的集成测试类在基本软件包中,这有关系吗?
我找到了一个选择:将失败测试配置放在外部类中,并仅在失败测试中调用它,但仍然不起作用。
目前,我的想法不多了,欢迎您的帮助!

2 个答案:

答案 0 :(得分:0)

我建议您使用@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;
    

答案 1 :(得分:0)

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