当前位置: 首页 > 知识库问答 >
问题:

Spring MVC控制器测试PUT

唐泳
2023-03-14

尝试用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中的update(...)方法返回为null。无法理解方式。请建议。

共有1个答案

公羊奇
2023-03-14

问题是这一行:

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

你应该把它改成

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

因为您的put请求正文是JSON,而不是真正的Client,所以当... thenBack语句没有像您预期的那样工作良好。mockedCusterService默认返回null。这就是为什么您得到一个空响应。因此您必须更正参数匹配器才能使其生效。

 类似资料:
  • 英文原文:http://emberjs.com/guides/testing/testing-controllers/ 单元测试方案和计算属性与之前单元测试基础中说明的相同,因为Ember.Controller集成自Ember.Object。 针对控制器的单元测试使用ember-qunit框架的moduleFor来做使这一切变得非常简单。 测试控制器操作 下面给出一个PostsController

  • spring-test模块对测试控制器@Controller提供了最原生的支持。详见14.6 "Spring MVC测试框架"一节。

  • 当使用mockito单元测试Spring mvc控制器时,如何注入道层对象。当使用SpringJUnit4ClassRunner类时,它总是使用@Spy注释给空指针异常。 示例代码: 在这个测试用例中,依次调用,它总是返回

  • 我一直在尝试使用: 使用此链接: 但我有一个错误: 当我换成: 是工作。我能做些什么来和日期一起工作? 谢啦

  • 本文向大家介绍AngularJS 单元测试控制器,包括了AngularJS 单元测试控制器的使用技巧和注意事项,需要的朋友参考一下 示例 控制器代码: 考试: 跑!

  • 我试图使用mockmvcbuilders.standalonesetup方法为一个spring mvc rest控制器创建一个非常基本的单元测试。我一直收到一个404错误。下面列出了测试应用程序上下文、测试类、控制器和整个堆栈跟踪。欢迎任何指导。 java.lang.AssertionError:状态应为:<200>但实际为:<404>在org.springframework.test.util.