嘗試啟動 JUnit 測驗時出現錯誤。當我呼叫該方法時,出現錯誤“java.lang.AssertionError:Status expected:<201> but was:<400>”。
我究竟做錯了什么 ?URL正確,程式運行正常,但測驗未通過。
我的控制器:
@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;
}
}
}
和我的測驗課:
@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;
}
uj5u.com熱心網友回復:
不確定這是否是問題所在,但您似乎希望正文中有一個 AddressRequest 物件,但您在測驗中發送了一個 Address 物件。如果到物件的 JSON 轉換失敗,則可能回傳 400 錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/390077.html
上一篇:用于SpringBoot(和其他Web框架)的Java或Kotlin
下一篇:SpringBootRestController中回傳void和ResponseEntity<Void>有什么區別?
