mockito Junit 5:测试条件是否涉及控制器中的私有属性

mlnl4t2r  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(156)

我正在尝试为以下控制器编写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”。有什么方法可以在我的测试类中更新这个值吗?

omhiaaxx

omhiaaxx1#

我所要做的就是在我的测试文件中创建一个test.properties(确保路径与/src/main目录中的路径相同),并使用以下注解@TestPropertySource(locations = "classpath:test.properties")标记我的测试类。该注解意味着test.properties将覆盖主目录中的属性文件。问题解决了,我的所有测试都成功了。

相关问题