@Autowired SpringRunner SpringBootTest单元测试用例

时间:2017-08-29 14:59:03

标签: java autowired spring-boot-test

我们的Spring Boot REST API目前有一个非常大的单元测试存储库。该单元将重构的公共可重用测试代码测试到@Component注释的TestUtil类中。 看起来SpringRunner单元测试用例只有在@SpringBootTest注释的classes参数的一部分导入时才能找到@Autowired TestUtil类。 此外,还需要在@SpringBootTest注释的classes参数中导入TestUtil类中的所有@Autowired变量。 由于我们有大约30个单元测试用例类,并且每个类需要在@SpringBootTest注释中导入大约40个其他类,因此可以想象这已经变得无法维护。

如果未将类作为@SpringBootTest类参数的一部分导入,则会引发以下错误

  

org.springframework.beans.factory.UnsatisfiedDependencyException:   创建名为&com; com.company.FeeTest':不满意的bean时出错   通过字段“accountTestUtils”表示的依赖关系;嵌套   例外是   org.springframework.beans.factory.NoSuchBeanDefinitionException:没有   属于' com.company.accountTestUtils'的限定bean可供选择:   预计至少有1个豆有资格成为autowire候选人。   依赖注释:   {@ org.springframework.beans.factory.annotation.Autowired(所需=真)}

有没有人知道在单元测试用例中使用@Autowired注释的更好方法,而不必在@SpringBootTest注释中进行明确的导入?

代码示例如下

FeeTest.java

package com.company;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {
        AccountTestUtils.class,
        ... need to list any @Autowired component in AccountTestUtils
})
public class FeeTest {
    @Autowired
    private AccountTestUtils accountTestUtils;

    @Test
    public void basicFeeTestExpectSuccess() {
       accountTestUtils.createAccount();
       ...
    }
}

TransferTest.java

package com.company;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {
        AccountTestUtils.class,
        ... need to list any @Autowired component in AccountTestUtils
})
public class TransferTest {
    @Autowired
    private AccountTestUtils accountTestUtils;

    @Test
    public void basicTransferTestExpectSuccess() {
       accountTestUtils.createAccount();
       ...
    }
}

AccountTestUtils.java

package com.company;

@Component
public class AccountTestUtils {
    @Autowired
    private IService1 someService1;

    @Autowired
    private IService2 someService2;

    @Autowired
    private SomeRepository someRepository1;

    public void createAccount() {
      someService1.doSomething();
      someService2.doSomething();
        someRepository2.doSomething();
    }
}    

我们的包结构是常见的maven结构

/src
    /main
        /java
        /resources
    /test
        /java
        /resources

1 个答案:

答案 0 :(得分:0)

让我从TransferTest.java类的pov谈起。

此类测试AccountUtilsTest类。因此,只需将AccountUtilTest类的依赖项提供给TransferTest。模拟每个自动关联并在AcccountUtilsTest中使用的依赖项。

例如:

package com.company;

@RunWith(SpringRunner.class)
public class TransferTest {

    @Mock
    IService1 someService1Mock;

    @Mock
    IService2 someService2Mock


    @InjectMocks
    private AccountTestUtils accountTestUtils;

    @Test
    public void basicTransferTestExpectSuccess() {
       accountTestUtils.createAccount();
       ...
    }
}