我正在尝试为以下控制器编写Junit测试:
@Value("${custom.properties.list}")
private List<String> stringList;
final DataService dataService;
@PostMapping("/")
public ResponseEntity<?> createValue(
@Valid @RequestBody final ObjectDto dto,
@RequestHeader(value = "headerField") final String headerValue) {
if (this.stringList.stream().noneMatch(headerValue::startsWith)) {
return ResponseEntity.status(HttpStatus.FORBIDDEN).body("error 403");
}
Long idResult = this.dataService.create(dto, headerValue);
if (Objects.equals(idResult, -1L)) {
return ResponseEntity.status(HttpStatus.204).body("error 204");
}
return new ResponseEntity<>(idResult, HttpStatus.CREATED);
}
字符串
假设stringList
包含值"ABC", "EFG", "HIJ"
。我正在测试headerValue
以列表中的一个值开始,返回代码201或204。
我的Junit测试如下:
@Test
void testCreateValue_1() throws Exception {
String requestBody = new String(Files.readAllBytes(Paths.get("src/test/resources/post/postRequest_1.json")));
MyObjectData data = mapper.readValue(requestBody, MyObjectData.class);
Mockito.when(dataService.create(data, "ABC")).thenReturn(1L);
mvc.perform(post("/")
.header("Nom-Application", "ABC")
.content(requestBody)
.contentType(MediaType.APPLICATION_JSON))
.andDo(print())
.andExpect(MockMvcResultMatchers.status().isCreated());
}
型
我不知道为什么,因为我对Junit测试很陌生,但是运行我的测试失败返回代码403。我试图在我的控制器测试类中创建列表,就像我在控制器类中创建列表一样,但是它不起作用。
我应该怎么做才能让我的测试通过并返回代码201?
编辑:或者这可能与从属性文件中获取字符串列表有关?
编辑2:当我启动我的测试时,我意识到stringList
中的唯一值是"${custom.properties.list}"
,所以我之前编辑的答案是“yes”。有什么方法可以在我的测试类中更新这个值吗?
1条答案
按热度按时间omhiaaxx1#
我所要做的就是在我的测试文件中创建一个test.properties(确保路径与/src/main目录中的路径相同),并使用以下注解
@TestPropertySource(locations = "classpath:test.properties")
标记我的测试类。该注解意味着test.properties
将覆盖主目录中的属性文件。问题解决了,我的所有测试都成功了。