问题摘要:
在常规运行期间成功创建了配置对象(使用 @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;
...
但是,问题出在单元测试期间,如defaultsConfigProperties
是 null
.
这是测试类:
@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/