Spring boot application-test.properties 未在被测组件内初始化

Posted

技术标签:

【中文标题】Spring boot application-test.properties 未在被测组件内初始化【英文标题】:Spring boot application-test.properties not initializes inside the tested component 【发布时间】:2019-01-22 06:00:21 【问题描述】:

我正在为从 application.properties 获取值的组件编写测试。

在测试本身中,值是从 application-test.properies 中正确获取的。 我使用了@TestPropertySource(locations = "classpath:application-test.properties")

但是在测试类中,值没有被拾取并且为空。

测试:

@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(locations = "classpath:application-test.properties")
public class ArtifactAssociationHandlerTest 

private InputStream inputStreamMock;
private ArtifactEntity artifactMock;
private ArtifactDeliveriesRequestDto requestDto;
@Value("$sdc.be.endpoint")
private String sdcBeEndpoint;
@Value("$sdc.be.protocol")
private String sdcBeProtocol;
@Value("$sdc.be.external.user")
private String sdcUser;
@Value("$sdc.be.external.password")
private String sdcPassword;

@Mock
private RestTemplate restClientMock;

@Mock
private RestTemplateBuilder builder;

@InjectMocks
private ArtifactAssociationService associationService;

@Before
public void setUp() throws IOException 
    inputStreamMock = IOUtils.toInputStream("some test data for my input stream", "UTF-8");
    artifactMock = new ArtifactEntity(FILE_NAME, inputStreamMock);
    requestDto = new ArtifactDeliveriesRequestDto("POST",END_POINT);
    MockitoAnnotations.initMocks(this);
    associationService = Mockito.spy(new ArtifactAssociationService(builder));
    associationService.setRestClient(restClientMock);

被测试的组件:

@Component("ArtifactAssociationHandler")
public class ArtifactAssociationService 

@Value("$sdc.be.endpoint")
private String sdcBeEndpoint;
@Value("$sdc.be.protocol")
private String sdcBeProtocol;
@Value("$sdc.be.external.user")
private String sdcUser;
@Value("$sdc.be.external.password")
private String sdcPassword;

private RestTemplate restClient;

@Autowired
public ArtifactAssociationService(RestTemplateBuilder builder) 
    this.restClient = builder.build();


 void setRestClient(RestTemplate restClient)
    this.restClient = restClient;

如何使用 application-test.properties 正确测试它?

【问题讨论】:

【参考方案1】:

您的setup 方法正在创建ArtifactAssociationService 的实例。这意味着它不是 Spring bean,因此没有执行任何依赖注入。这包括注入带有@Value 注释的字段。

如果您希望@Value-annotated 字段的值被注入,您将必须使您的ArtifactAssociationService 实例成为一个bean,例如通过在@Configuration 类中使用@Bean 方法创建它。

【讨论】:

我原本没有在setup方法中创建实例,是为了将restCilent设置为mock实例。即使删除了初始化 - 它仍然是相同的(值为空):@Spy InjectMocks private ArtifactAssociationService associationService;在 public void setUp() 抛出 IOException MockitoAnnotations.initMocks(this); //associationService = Mockito.spy(new ArtifactAssociationService(builder));关联服务.setRestClient(restClientMock); 评论中的代码很难读懂,但看起来你仍在自己创建ArtifactAssociationServicenew ArtifactAssociationService(builder) 对不起,我无法将它添加为代码块.. 此行已被注释掉

以上是关于Spring boot application-test.properties 未在被测组件内初始化的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2Spring Boot CLI

为啥 Spring Boot 应用程序 pom 同时需要 spring-boot-starter-parent 和 spring-boot-starter-web?

《02.Spring Boot连载:Spring Boot实战.Spring Boot核心原理剖析》

spring-boot-quartz, 依赖spring-boot-parent

spring-boot系列:初试spring-boot

Spring-Boot Banner