Пустое тело в SpringBoot WebMvcTest
Я получаю результат от моего модульного теста, который я не совсем понимаю.
Код контроллера
package com.rk.capstone.controllers;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.rk.capstone.model.domain.User;
import com.rk.capstone.model.services.user.IUserService;
/**
* REST Controller for /register endpoint
*/
@RestController
@RequestMapping("/register")
public class RegisterController {
private final IUserService userService;
public RegisterController(IUserService userService) {
this.userService = userService;
}
@RequestMapping(value = "/user", method = RequestMethod.POST)
public ResponseEntity<User> registerNewUser(@RequestBody User user) {
if (userService.findByUserName(user.getUserName()) == null) {
user = userService.saveUser(user);
return ResponseEntity.status(HttpStatus.CREATED).body(user);
} else {
return ResponseEntity.status(HttpStatus.CONFLICT).body(null);
}
}
}
Код модульного теста:
package com.rk.capstone.controllers;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.rk.capstone.model.dao.UserDao;
import com.rk.capstone.model.domain.User;
import com.rk.capstone.model.services.user.IUserService;
import static org.mockito.BDDMockito.given;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
/**
* Class Provides Unit Testing for RegisterController
*/
@RunWith(SpringRunner.class)
@WebMvcTest(RegisterController.class)
public class RegisterControllerTest {
@MockBean
private IUserService userService;
@Autowired
private MockMvc mockMvc;
private User user;
private String userJson;
@Before
public void setup() {
user = new User("rick", "k", "rick@email.com", "rkow", "abc123");
ObjectMapper objectMapper = new ObjectMapper();
try {
userJson = objectMapper.writeValueAsString(user);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
@Test
public void testRegisterNewUserPostResponse() throws Exception {
given(this.userService.findByUserName(user.getUserName())).willReturn(null);
given(this.userService.saveUser(user)).willReturn(user);
Assert.assertNotNull("Mocked UserService is Null", this.userService);
this.mockMvc.perform(post("/register/user").content(userJson).
contentType(MediaType.APPLICATION_JSON)).
andExpect(status().isCreated()).
andDo(print()).andReturn();
}
}
Результат print() ниже, я не понимаю, почему тело пусто. Я пробовал множество вещей, которые читал в других постах и блогах, и что бы я ни делал, тело всегда пусто. Добавление заголовка Content-Type в ответе контроллера не имеет значения.
MockHttpServletResponse:
Status = 201
Error message = null
Headers = {}
Content type = null
Body =
Forwarded URL = null
Redirected URL = null
Cookies = []
Что меня еще больше смущает, так это когда я запускаю реальное приложение и выполняю POST с использованием PostMan для конечной точки /register/user, ответ содержит ожидаемое тело и код состояния, пользователя, представленного через JSON, например
Код статуса: 201 Создано тело ответа
{
"userId": 1,
"firstName": "rick",
"lastName": "k",
"emailAddress": "rick@email.com",
"userName": "rk",
"password": "abc123"
}
Любая помощь или идеи приветствуются, используя SpringBoot 1.4.0.RELEASE.
ОБНОВЛЕНИЕ: по некоторым причинам следующий вызов смоделированного метода возвращает нуль в тестируемом контроллере.
given(this.userService.saveUser(user)).willReturn(user);
1 ответ
Эта тема в конечном итоге привела меня к решению:
Mockito когда / то не возвращает ожидаемое значение
Изменили эту строку:
given(this.userService.saveUser(user)).willReturn(user);
в
given(this.userService.saveUser(any(User.class))).willReturn(user);