gpt4 book ai didi

java - @Autowired 在 SpringRunner SpringBootTest 单元测试用例中

转载 作者:行者123 更新时间:2023-12-01 04:30:04 29 4
gpt4 key购买 nike

我们的 Spring Boot REST API 目前有一个相当大的单元测试存储库。单元测试将常见的可重用测试代码重构为 TestUtil类是 @Component注释。

看来SpringRunner单元测试用例只能找到@Autowired TestUtil类,如果它们作为 @SpringBootTest 的类参数的一部分导入注解。

此外,所有 @Autowired TestUtil 中的变量类也需要在 @SpringBootTest 的 classes 参数中导入注解。

由于我们有大约 30 个单元测试用例类,每个类需要在 @SpringBootTest 中导入大约 40 个其他类。注释,可以想象这变得多么难以维护。

如果类未作为 @SpringBootTest 的一部分导入classes 参数,抛出以下错误

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.company.FeeTest': Unsatisfied dependency expressed through field 'accountTestUtils'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.company.accountTestUtils' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}



有谁知道更好的使用方法 @Autowired单元测试用例中的注释,而无需在 @SpringBootTest 中显式导入它们注解?

代码示例如下

费用测试程序
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();
...
}
}

传输测试.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

最佳答案

我从 TransferTest.java 类的 pov 说起。

此类测试 AccountUtilsTest 类。因此,只需将 AccountUtilTest 类的依赖项提供给 TransferTest.Mock 每个自动连接并在 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();
...
}
}

关于java - @Autowired 在 SpringRunner SpringBootTest 单元测试用例中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45942402/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com