![](/img/trans.png)
[英]java.lang.AssertionError: Status expected:<201> but was:<400>
[英]AssertionError: Status expected:<201> but was:<400> JUnit POST Method
嘗試啟動 JUnit 測試時出現錯誤。 當我調用該方法時,出現錯誤“java.lang.AssertionError: Status expected:<201> but was:<400>”。
我究竟做錯了什么? URL是對的,程序運行正常,但是測試沒有通過。
我的 Controller:
@RestController
@RequestMapping(value = "addresses", produces = MediaType.APPLICATION_JSON_VALUE)
@RequiredArgsConstructor
public class AddressController {
private final AddressService addressService;
@GetMapping("/{id}")
public AddressResponse getAddress(@PathVariable Integer id) {
return addressService.getAddress(id)
.map(AddressResponse::convertToResponse)
.orElse(null);
}
@GetMapping
public List<AddressResponse> getAllAddresses() {
return addressService.getAllAddresses()
.stream()
.map(AddressResponse::convertToResponse)
.collect(Collectors.toList());
}
@PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
public AddressResponse createAddress(@RequestBody AddressRequest request) {
return AddressResponse.convertToResponse(addressService.upsertAddress(request));
}
@PutMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
public AddressResponse updateAddress(@RequestBody AddressRequest request) {
return AddressResponse.convertToResponse(addressService.upsertAddress(request));
}
@DeleteMapping("/{id}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public Address deleteAddress(@PathVariable Integer id) {
return addressService.deleteAddress(id);
}
我的服務:
@Service
@RequiredArgsConstructor
public class AddressService {
private final AddressRepository addressRepository;
public Optional<Address> getAddress(Integer id) {
return addressRepository.findById(id);
}
public List<Address> getAllAddresses() {
return addressRepository.findAll();
}
public Address upsertAddress(@NonNull AddressRequest addressRequest) {
Address entity;
if (addressRequest.getId() == null) {
entity = new Address();
} else {
entity = addressRepository.findById(addressRequest.getId())
.orElseThrow(() -> new RuntimeException("Cannot find address by id"));
}
entity.setCity(addressRequest.getCity());
entity.setStreet(addressRequest.getStreet());
entity.setHouse(addressRequest.getHouse());
entity = addressRepository.save(entity);
return entity;
}
public Address deleteAddress(Integer id) {
Address address = null;
Optional<Address> optional = addressRepository.findById(id);
if (optional.isPresent()) {
address = optional.get();
addressRepository.deleteById(id);
}
return address;
}
}
}
我的測試 Class:
@ExtendWith(MockitoExtension.class)
class AddressControllerTest {
@Mock
private AddressService addressService;
private com.second_bank.entities.Address address;
private List<Address> addressList;
@InjectMocks
private AddressController addressController;
@Autowired
MockMvc mockMvc;
@BeforeEach
public void setup() {
com.second_bank.entities.Address address = new com.second_bank.entities.Address("City", "Street", "House");
mockMvc = MockMvcBuilders.standaloneSetup(addressController).build();
}
@AfterEach
public void tearDown() {
address = null;
addressList = null;
}
@Test
void createAddress() throws Exception {
when(addressService.upsertAddress(any())).thenReturn(address);
mockMvc.perform(post("/addresses")
.contentType(MediaType.APPLICATION_JSON)
.content(asJsonString(address)))
.andExpect(status().isCreated());
verify(addressService, times(1)).upsertAddress(any());
}
我創建了一種將對象轉換為 JSON 的方法
public static String asJsonString(final Object obj) {
try {
return new ObjectMapper().writeValueAsString(obj);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
DTO 回應:
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class AddressResponse {
private Integer id;
private String city;
private String street;
private String house;
public static AddressResponse convertToResponse(Address address){
return new AddressResponse(
address.getId(),
address.getCity(),
address.getStreet(),
address.getHouse()
);
}
}
DTO Request:
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class AddressRequest {
private Integer Id;
private String city;
private String street;
private String house;
}
不確定這是否是問題所在,但您似乎期望正文中有一個 AddressRequest object,但您在測試中發送了一個地址 object。 如果 JSON 轉換為 object 失敗,則可能返回 400 錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.