簡體   English   中英

AssertionError: Status expected:<201> but was:<400> JUnit POST 方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM