try 用junit5和mockito测试我的web层(spring boot、spring mvc).http方法的所有其他测试(get、put等)工作正常,但更新.

控制器:

@PutMapping(value = "{id}")
public ResponseEntity<?> putOne(@PathVariable Integer id, @Valid @RequestBody Customer customerToUpdate) {
    Customer updated = customerService.update(id, customerToUpdate);
    return ResponseEntity.ok(updated);
}    

服务:

public Customer update(Integer customerId, Customer customerToUpdate) {
    Customer customerFound = customerRepository.findById(customerId).orElseThrow(() -> {
        throw new CustomerControllerAdvice.MyNotFoundException(customerId.toString());
    });

    customerToUpdate.setId(customerFound.getId());

    return customerRepository.save(customerToUpdate);
}

最后,测试:

static final Customer oneCustomer = Customer.of(3,"john", LocalDate.of(1982, 11, 8));
    
@Test
void putOneTest() throws  Exception {
    when(customerService.update(oneCustomer.getId(), oneCustomer)).thenReturn(oneCustomer);

    mockMvc.perform(put(CUSTOMER_URL + oneCustomer.getId())
                    .contentType(MediaType.APPLICATION_JSON)
                    .content(objectMapper.writeValueAsString(oneCustomer)))
            .andDo(print())
            .andExpect(jsonPath("$.name").value(oneCustomer.getName()))
                .andExpect(jsonPath("$.birthDate").value(oneCustomer.getBirthDate().toString()))
                .andExpect(status().isOk());
}

结果:

java.lang.AssertionError: No value at JSON path "$.name"

更新(…)CustomerService中的方法仅返回null.我不明白怎么回事.请给出建议.

推荐答案

问题在于这一行:

when(customerService.update(oneCustomer.getId(), oneCustomer)).thenReturn(oneCustomer);

你应该把它改成

when(customerService.update(eq(oneCustomer.getId()), any())).thenReturn(oneCustomer);

因为你的put请求主体是JSON,而不是真正的Customer,所以when...thenReturn语句并没有像你预期的那样好用.mocked customerService默认返回空值.这就是为什么你得到了一个空洞的回答.因此,你必须纠正参数匹配器,使其正确.

Java相关问答推荐

如何在使用 Stream 的同时将 Long 转换为 BigDecimal

将数组减半的时间复杂度

由于非私有方法未覆盖或实现超类型中的方法,因此无法使用“<>”

@Query Java Spring Boot

Swing 从弹出表中获取用户输入

Android Material TextInputLayout endIcon 截断 MaterialAutoCompleteTextView 中的文字

Javax.swing 如何删除前一个矩形

如何在不定义每个 Spring bean 的情况下创建多个相同类型的 Spring bean

将 android studio 升级到 Android Studio Chipmunk 后 | 2021.2.1 得到这个 gradle 问题

Java 流不打印出预期值

如何在 Databricks Spark Scala 中使用当前月份的第一天创建变量?

java JFileChooser如何临时禁用文件选择窗口

如何在执行 Collectors.toMap() 之前删除会导致冲突的键

有效地改变 JSON 数据的结构

如何遵循鲍勃叔叔的规则(建议)在一种方法中正确使用一个 try-catch 块?

春天卡夫卡 |如何使 DeserializationException 可重试?

使用方法返回的收集器时泛型类型不匹配 - Java 17

如何为 BottomNavigationView 设置 colored颜色 ?

Java中的重复输出

无法解析方法“assertThat(int)”