gpt4 book ai didi

java - 在 Spring Boot 的单元测试期间将配置对象注入(inject)到服务 bean

转载 作者:行者123 更新时间:2023-12-02 10:48:35 25 4
gpt4 key购买 nike

问题摘要:

在常规运行期间成功创建了配置对象(使用 @Autowired ),但为 null在单元测试阶段运行时。

编辑,以回应将问题标记为重复的问题:我不认为这是 Why is my Spring @Autowired field null? 的重复因为我的问题是关于单元测试阶段的,而上面的问题是关于常规运行阶段的。

详细:

我有一个读取属性文件的配置对象:

@Configuration
@ConfigurationProperties(prefix = "defaults")
@Getter
@Setter
public class DefaultsConfigProperties {
Double value;
....

在服务层,我在常规模式下运行应用程序时成功使用了此类:

@Service
@Configuration
public class CatsService {

@Autowired
DefaultsConfigProperties defaultsConfigProperties;
...

但是,问题出在单元测试期间,如defaultsConfigPropertiesnull .

这是测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@TestPropertySource(properties = {
"defaults.value=0.2"
})
public class CatServiceTest {
private CatService;

@Before
public void before(){
catService = new CatService();
}

如果我理解正确,我需要以某种方式创建/注入(inject)/模拟 DefaultsConfigProperties单元测试阶段的类(class)。

我也知道使用@Autowired不推荐,最好将项目传递给类的构造函数。那么,解决方案应该是 CatService需要接受DefaultsConfigProperties在构造函数中,然后在 CatServiceTest 中创建它(如何?) ?

最佳答案

您走在正确的轨道上,正如您所说,构造函数注入(inject)比字段注入(inject)更受青睐。

不过,如果您想依赖字段注入(inject),您可以使用 Mockito

单元测试中的使用示例:

@Mock
DefaultsConfigProperties defaultsConfigProperties;

@InjectMocks
private CatService;

@Before
public void before(){
catService = new CatService();
MockitoAnnotations.init(this);
}

因此,在您的情况下,您还应该删除测试类的注释以使其成为单元测试。

关于java - 在 Spring Boot 的单元测试期间将配置对象注入(inject)到服务 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52362858/

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