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

标签 java spring unit-testing spring-boot configuration

问题摘要:

在常规运行期间成功创建了配置对象(使用 @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/

相关文章:

Java Springboot,RestTemplate结果数编码

java - 需要让开源httpclient中的httpstatus抛出异常

java - 如何使用 JSTL 迭代字符串映射中的列表和对象列表?

java - 如何创建 org.springframework.util.concurrent.ListenableFuture 的完整实例

java - 如何准确读懂递归方法

java - 为什么 Spring 的 ApplicationContext.getBean 被认为不好?

javascript - Angular/Jasmine - 在 ng-if 中测试 HTML 元素

php - 在 PHP 中对 HTML 进行可靠的单元测试

支持可选参数和 .Net 4.0 的 C# Mocking Framework

java - 在 Spring Boot MongoDB 中查找重复条目?