【问题标题】:When try to test post() rest endpoint see: json can not be null or empty当尝试测试 post() 休息端点时,请参阅:json 不能为空或为空
【发布时间】:2020-08-10 23:10:24
【问题描述】:

如果我尝试测试 post() 端点,我会看到:

java.lang.AssertionError:JSON 路径“$.firstName”处没有值

原因:java.lang.IllegalArgumentException: json 不能为 null 或为空

但是对于 get() 的测试一切正常。 在 postTest() 中,状态的结果是正确的。 我的错在哪里? 以这种方式测试其余控制器是否正确?

@RunWith(MockitoJUnitRunner.Silent.class)
public class Temp {
    private final Employee successfullyRegisteredEmployee = new Employee(2L, "Iven");
    private final Employee employeeGetById = new Employee(2L, "Iven");


    @Mock
    private EmployeeServiceImpl serviceMock;

    private MockMvc mockMvc;

    @Before
    public void setUp() throws Exception {
        mockMvc = MockMvcBuilders.standaloneSetup(new EmployeeControllerImpl( serviceMock))
                .build();
    }


    @Test
    public void getTest() throws Exception {
        when(serviceMock.getEmployee(2L)).thenReturn(employeeGetById);

        mockMvc.perform(get("/employee/get/2"))
                .andExpect(status().is(200))
                .andExpect(content().json(("{'firstName':'Iven'}")));

        verify(serviceMock).getEmployee(2L);
    }



    @Test
    public void postTest() throws Exception {
        String json = "{\n" +
                "  \"firstName\": \"Iven\"\n" 
                "}";
        when(serviceMock.register(employeeForRegister)).thenReturn(successfullyRegisteredEmployee);

        mockMvc.perform( MockMvcRequestBuilders
                .post("/employee/register")
                .content(json)
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON))
                .andExpect(status().is(201))
                .andExpect(jsonPath("$.firstName", Matchers.is("Iven")));

    }
}

@RestController
@RequestMapping("/employee")
public class EmployeeControllerImpl implements EmployeeController {
    private final EmployeeService service;

    public EmployeeControllerImpl(EmployeeService service) {
        this.service = service;
    }

    @PostMapping(path = "/register",
            consumes = "application/json",
            produces = "application/json"
    )
    public ResponseEntity<Employee> registerEmployee(@Valid @RequestBody Employee employee) {
        Employee registeredEmployee = service.register(employee);
        return ResponseEntity.status(201).body(registeredEmployee);
    }
}

【问题讨论】:

    标签: java spring unit-testing spring-mvc spring-test-mvc


    【解决方案1】:

    when(serviceMock.register(employeeForRegister)).thenReturn(successfullyRegisteredEmployee); 似乎有问题。

    您是否尝试在return ResponseEntity.status(201).body(registeredEmployee); 上设置断点来检查registeredEmployee 是否实际被填充? 如果它是空的,那么尝试用 when(serviceMock.register(any())).thenReturn(successfullyRegisteredEmployee); 替换 mock,如果它有效,则意味着 equals() 方法没有被 Employee 覆盖,或者比较失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-02
      • 2017-08-17
      • 2018-10-19
      • 1970-01-01
      • 2012-03-10
      • 2016-05-24
      • 1970-01-01
      相关资源
      最近更新 更多