मैं वर्तमान में एक स्प्रिंग बूट CRUD RESTful API के अंतिम बिंदुओं का परीक्षण कर रहा हूं और मेरे पास निम्न "इसकी आईडी द्वारा उपयोगकर्ता को अपडेट करें" समापन बिंदु है जो एक नियंत्रक से बना है और एक सेवा अपने तर्क को लागू करने के लिए :

अद्यतन नियंत्रक (यह मुख्य रूप से सेवा के तर्क को बुला रहा है और कुछ दिशानिर्देशों को परिभाषित कर रहा है):

@RestController
@RequestMapping("/users/{id}")
public class UpdateUserController {

    @Autowired
    UpdateUserService service;

    @PutMapping
    @ResponseStatus(HttpStatus.OK)
    public ResponseEntity<User> updateUser_whenPutUser(@RequestBody User user, @PathVariable Long id) {
        return ResponseEntity.ok().body(service.updateUser(id, user));
    }
}

अपडेट सेवा :

@Service
public class UpdateUserService {

    @Autowired
    UserRepository repository;

    public User updateUser(Long id, User user) {

        repository.findById(id)
                .orElseThrow(() -> new UserNotFoundException(id));

        user.setId(id);
        return repository.save(user);
    }
}

जबकि अब तक सब कुछ ठीक काम कर रहा है, मैं सराहना करता हूं अगर कोई मुझे बता सकता है कि मैं उपरोक्त कोड में क्या सुधार कर सकता हूं। वैसे भी, मेरे नियंत्रक अपवाद इकाई परीक्षण फेंकते हैं वह समस्या है जिसे मैं हल नहीं कर सकता:

@RunWith(SpringRunner.class)
@WebMvcTest(UpdateUserController.class)
public class UpdateUserControllerTest {
    @Autowired
    private MockMvc mvc;

    @MockBean
    private UpdateUserService updateUserService;

    @Test
    public void updateUser_whenPutUser() throws Exception {

        User user = new User();
        user.setName("Test Name");
        user.setId(89L);

        given(updateUserService.updateUser(user.getId(), user)).willReturn(user);

        ObjectMapper mapper = new ObjectMapper();

        mvc.perform(put("/users/" + user.getId().toString())
                .content(mapper.writeValueAsString(user))
                .contentType(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(jsonPath("name", is(user.getName())));
    }

    @Test
    public void should_throw_exception_when_user_doesnt_exist() throws Exception {
        User user = new User();
        user.setId(89L);
        user.setName("Test Name");

        Mockito.doThrow(new UserNotFoundException(user.getId())).when(updateUserService).updateUser(user.getId(), user);

        mvc.perform(put("/users/" + user.getId().toString())
                .contentType(MediaType.APPLICATION_JSON))
                .andExpect(status().isNotFound());
    }
}

हालांकि updateUser_whenPutUser पास हो रहा है, अपवाद इकाई परीक्षण का परिणाम है:

java.lang.AssertionError: Status expected:<404> but was:<400>
Expected :404
Actual   :400

जिसका अर्थ है कि इसे अपवाद द्वारा फेंके गए अपेक्षित 404 के बजाय 400 प्रतिक्रिया स्थिति प्राप्त हो रही है।

मजे की बात है, अगर मैं अपने @WebMvcTest(UpdateUserController.class) को @WebMvcTest(UpdateUserService.class) में बदलता हूं तो यह पास हो जाता है, लेकिन फिर मेरे नियंत्रक मुख्य इकाई परीक्षण विफल हो जाते हैं। पता नहीं क्यों।

सराहना करेंगे अगर कोई इस के साथ मदद कर सकता है।

1
Gabriel Pulga 22 जून 2020, 16:45

2 जवाब

पहले आप अपना टेस्ट एनोटेशन एक अपेक्षित प्रकार दे सकते हैं। इस कदर

@Test(expected = NotFoundException.class)
public void test(){
   ...
}

आपको 404 के बजाय 400 मिलने का कारण कहना मुश्किल है। मेरा सुझाव है कि इसका status() मेथोड से कुछ लेना-देना है। शायद आप कुछ और स्टैकट्रैक प्रदान कर सकते हैं? या मुझे लगता है कि अपवाद कहां होता है यह जानने के लिए आपको अपने परीक्षणों को डीबग करने की आवश्यकता है।

0
Mafick 22 जून 2020, 18:23
यह अजीब है क्योंकि मैं अपने सभी समापन बिंदुओं में इसी विधि का उपयोग कर रहा हूं और यह केवल इसमें विफल हो रहा है।
 – 
Gabriel Pulga
22 जून 2020, 19:03
अपने आवेदन को डीबग करें और देखें कि ब्रेक में कौन सी लाइन है
 – 
Mafick
22 जून 2020, 20:00

मुझे समाधान मिल गया है:

400 प्रतिक्रिया स्थिति त्रुटि लौटाने का कारण यह है कि कोई संदेश मुख्य भाग नहीं भेजा जा रहा था

इस विशिष्ट समापन बिंदु को अनुरोध पर JSON में लिखे गए एक संदेश निकाय की आवश्यकता है:

@Test
public void should_throw_exception_when_user_doesnt_exist() throws Exception {
    User user = new User();
    user.setId(89L);
    user.setName("Test Name");

    Mockito.doThrow(new UserNotFoundException(user.getId())).when(updateUserService).updateUser(user.getId(), user);
    ObjectMapper mapper = new ObjectMapper();

    mvc.perform(put("/users/" + user.getId().toString())
            .content(mapper.writeValueAsString(user))
            .contentType(MediaType.APPLICATION_JSON))
            .andExpect(status().isNotFound());
}
0
Gabriel Pulga 23 जून 2020, 00:47