web-dev-qa-db-fra.com

Comment tester POST dans Spring Boot en utilisant Mockito et JUnit

Je suis novice dans les tests unitaires utilisant JUnit et Mockito dans le framework de démarrage Spring. Je veux tester cette méthode. Comment tester POST Méthode de demande:

// add Employee
@RequestMapping(method = RequestMethod.POST)
public void addEmployee(@RequestBody Employee employee){
    this.employeeService.addEmployee(employee);
}

Merci d'avance

6
sk555

Comme @ merve-sahin l'a souligné à juste titre, vous pouvez utiliser @WebMvcTest pour y parvenir.

Regardez l'exemple suivant:

@RunWith(SpringRunner.class)
@WebMvcTest(YourController.class)
public class YourControllerTest {

    @Autowired MockMvc mvc;
    @MockBean EmployeeService employeeService;

    @Test
    public void addEmployeeTest() throws Exception {

        Employee emp = createEmployee();

        mvc.perform(post("/api/employee")
            .contentType(MediaType.APPLICATION_JSON)
            .content(toJson(emp)))
            .andExpect(status().isOk());
    }
}

Dans le code ci-dessus, vous pouvez vous moquer de votre service dépendant en utilisant @MockBean. Le test effectuera la publication sur votre objet Employé personnalisé et validera la réponse

Vous pouvez ajouter des en-têtes, l'autorisation lors de l'appel de perform

En supposant que vous utilisez JSON comme type de support, vous pouvez écrire la méthode toJson () en utilisant n'importe quelle bibliothèque json pour convertir l'objet Employee au format de chaîne Json

private String toJson(Employee emp) {

Si vous utilisez XML, vous pouvez faire de même pour XML

Vous pouvez valider la réponse en utilisant les attentes de manière chaînée. Comme indiqué à juste titre, veuillez vérifier le lien MockedMvc ​​qui devrait vous aider

6
Ashish Mishra

Parcourez cet exemple suivant:

@RunWith(SpringJUnit4ClassRunner.class)
public class ApplicationControllerTest {

    @Mock
    EmployeeService employeeService;

    private MockMvc mockMvc;

    @Before
    public void setUp() throws Exception {
        initMocks(this);
        YourController controller = new YourController(employeeService);
        mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
    }

    @Test
    public void addEmployee() throws Exception {
        Employee emp = new Employee("emp_id","emp_name");//whichever data your entity class have

        Mockito.when(employeeService.addEmployee(Mockito.any(Employee.class))).thenReturn(emp);

        mockMvc.perform(MockMvcRequestBuilders.post("/employees")
                .content(asJsonString(emp))
                .contentType(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(content().contentType("application/json;charset=UTF-8"));
    }

    public static String asJsonString(final Object obj) {
        try {
            return new ObjectMapper().writeValueAsString(obj);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

Dans l'exemple donné ci-dessus, moquez votre classe de service qui est nécessaire pour publier les données dans votre classe d'entité Employé. Je suppose que vous le faites via le contrôleur, vous devez donc d'abord initialiser le contrôleur qui se trouve sous l'annotation @Before.

En faisant l'exemple ci-dessus, vous pourrez publier vos données au format JSON.

0
Ravi Mengar