Есть несколько проблем с вашим тестом:
1. Запрос картографирования
@PostMapping("/create")
public ResponseEntity<?> createUser(
@RequestHeader("Authorization") String token,
@RequestBody User user)
соответствует только POST
запросам с заголовком HTTP с именем Authorization
и телом запроса, которое можно сериализовать до User
. Это не обязательно. Если они являются необязательными, вы должны явно объявить, что:
@PostMapping("/create")
public ResponseEntity<?> createUser(
@RequestHeader(name = "Authorization", required = false) String token,
@RequestBody(required = false) User user) {
Предполагая, что они требуются, вы должны настроить MockMvc для отправки обоих на ваш контроллер:
@Test
public void testCreateUser() throws Exception {
mockMvc.perform(
post("/api/create")
.header("Authorization", "XYZ")
.content("{\"firstName\": \"James\", \"lastName\": \"Gosling\"}")
.accept(MediaType.APPLICATION_JSON)
)
.andExpect(status().isCreated())
.andExpect(jsonPath("$.*", Matchers.hasSize(1)));
}
здесь я предположил, что ваш User
класс такой:
public class User {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
2. Content-Type
заголовок
Кроме того, вы должны установить заголовок типа контента для вашего запроса MockMvc, в противном случае проверка не будет выполнена с 415 - Unsupported Media Type
. Итак, ваш тест должен выглядеть так:
@Test
public void testCreateUser() throws Exception {
mockMvc.perform(
post("/api/create")
.header("Authorization", "XYZ")
.header("Content-Type", "application/json")
.content("{\"firstName\": \"James\", \"lastName\": \"Gosling\"}")
.accept(MediaType.APPLICATION_JSON)
)
.andExpect(status().isCreated())
.andExpect(jsonPath("$.*", Matchers.hasSize(1)));
}
3. Макетные зависимости
Кроме того, в своем тесте вы аннотировали MyController
с помощью @InjectMocks
, но вы не высмеивали его MyService' dependency. That will set the
myService field of your controller to
null . To fix that you need to mock
MyService ':
@RunWith(SpringRunner.class)
public class MyControllerTest {
private MockMvc mockMvc;
// Mock
@Mock
private MyService myService;
@InjectMocks
private MyController myController;
@Before
public void setUp() throws Exception {
mockMvc = MockMvcBuilders.standaloneSetup(myController).build();
}
@Test
public void testCreateUser() throws Exception {
// Configure mock myService
when(myService.create(anyString(), any(User.class))).thenReturn(new ResponseEntity<>(HttpStatus.CREATED));
mockMvc.perform(
post("/api/create")
.header("Authorization", "XYZ")
.header("Content-Type", "application/json")
.content("{\"firstName\": \"James\", \"lastName\": \"Gosling\"}")
.accept(MediaType.APPLICATION_JSON)
)
.andExpect(status().isCreated())
.andExpect(jsonPath("$.*", Matchers.hasSize(1)));
}
}
4. MyService
не удовлетворяет условиям испытаний
Когда все в порядке, ваш контроллер отвечает:
ResponseEntity<ResponseDTO> finalEntity = ResponseEntity.ok().body(finalResponse);
, который вернет код состояния 200. Таким образом, вы должны либо изменить свой тест, чтобы ожидать, что:
.andExpect(status().isOk())
или вам следует обновить контроллер, чтобы он возвращался с кодом состояния 201:
ResponseEntity<ResponseDTO> finalEntity = ResponseEntity.created(null).body(finalResponse);