как использовать mockito и junit для тестирования моего весеннего загрузочного остальных API? - PullRequest
0 голосов
/ 05 февраля 2019

Я новичок в модульном тестировании и не могу понять, как протестировать RESTFul API с помощью Spring, используя Mockito и Junit. Прежде всего, я подготовил класс, в котором я создал два метода с @ Before и @ Test , когда я перешел в режим отладки, он говорит мне, что коллекция hasSize возвращает 0, а не 4.

@RunWith(SpringJUnit4ClassRunner.class)
public class EmployeControllerTest {
    private MockMvc mockMvc;
    @InjectMocks
    private EmployeController employeController ; 
    @Mock
    private EmployeService employeService ;

    @Before
    public void setUp() throws Exception{
        MockitoAnnotations.initMocks(this);
        mockMvc=MockMvcBuilders.standaloneSetup(employeController).build();
    }
    @Test
    public void testgetAllEmployee() throws Exception{
        List<Employe> employes= Arrays.asList(
                new Employe("Hamza", "Khadhri", "hamza1007", "123")
                ,new Employe("Oussema", "smi", "oussama", "1234") );
        when(employeService.findAll()).thenReturn(employes);
        mockMvc.perform(get("/employe/dto"))
        .andExpect(status().isOk())
        .andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE))
        .andExpect(jsonPath("$", hasSize(4)))
         .andExpect(jsonPath("$[0].nom", is("Hamza")))
         .andExpect(jsonPath("$[0].prenom", is("Khadhri")))
         .andExpect(jsonPath("$[0].login", is("hamza1007")))
         .andExpect(jsonPath("$[0].mp", is("123")))
         .andExpect(jsonPath("$[1].nom", is("Oussema")))
         .andExpect(jsonPath("$[1].prenom", is("smi")))
         .andExpect(jsonPath("$[1].login", is("oussama")))
         .andExpect(jsonPath("$[1].mp", is("1234")));

        verify(employeService,times(1)).findAll();
        verifyNoMoreInteractions(employeService);
    }
}

, вот EmployeController:

    @CrossOrigin(origins = "*", allowedHeaders = "*")
    @RestController
    @RequestMapping("/employe")
    public class EmployeController {
        @Autowired
        private EmployeService employeService;

        @Autowired
        private ModelMapper modelMapper;

        @GetMapping("/dto")
        public List<EmployeDTO> getEmployeDTOList(){
            try {
                    List<Employe> listemp=employeService.findAllEmployeActive();
                    return listemp.stream()
                        .map(emp ->convertToDto(emp))
                        .collect(Collectors.toList());
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }

        private EmployeDTO convertToDto(Employe emp) {
            EmployeDTO empDto = modelMapper.map(emp, EmployeDTO.class);

            return empDto;
       }
   }

когда я переключаюсь в режим отладки, он говорит мне, что есть NullPointerException.

Как правильно использовать mockito и junit для успешного прохождения теста?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Это код, который работает, но он игнорирует объект emp1 :

 public void testgetAllEmployeeWithModelMapper() throws Exception{
         Employe emp1 = new Employe("Hamza", "Khadhri", "hamza1007", "123");
         Employe emp2 = new Employe("Oussem", "smi", "oussama", "1234");
         List<Employe> Employees= Arrays.asList(emp1, emp2);
         EmployeDTO dto1 = new EmployeDTO("Hamza", "Khadhri", "hamza1007", "123");
         EmployeDTO dto2 = new EmployeDTO("Oussem", "smi", "oussama", "1234");
         when(modelMapper.map(emp1,EmployeDTO.class)).thenReturn(dto1);
         when(modelMapper.map(emp2,EmployeDTO.class)).thenReturn(dto2);

         when(employeeService.findAll()).thenReturn(Employees);
         mockMvc.perform(get("/employe/dto"))
         .andExpect(status().isOk())
         .andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE))
         .andExpect(jsonPath("$", hasSize(2)))
         .andExpect(jsonPath("$[0].nom", is("Hamza")))
         .andExpect(jsonPath("$[0].prenom", is("Khadhri")))
         .andExpect(jsonPath("$[0].login", is("Hamza1007")))
         .andExpect(jsonPath("$[0].mp", is("123")))
         .andExpect(jsonPath("$[1].nom", is("Oussema")))
         .andExpect(jsonPath("$[1].prenom", is("smi")))
         .andExpect(jsonPath("$[1].login", is("oussama")))
         .andExpect(jsonPath("$[1].mp", is("1234")));

     verify(employeeService,times(1)).findAll();
     verifyNoMoreInteractions(employeeService);
    }

}

Косоль показывает мне, что jsonPath ("$ [0] .nom" ожидают Oussema поэтому, когда я изменяю его на Oussema, который является объектом emp2 , и он работает хорошо, к сожалению, он игнорирует объект emp1 , который содержит Hamza , лично я просто добавляю два конструктора в Employe и EmployeDTO.

это класс Employe:

 public class Employe implements Serializable {



    @Id
    @Column(unique=true, nullable=false, precision=6)
    private Long id;
    @Column(precision=6)
    private BigDecimal cv;
    @Column(length=254)
    private String nom;
    @Column(length=254)
    private String prenom;
    @Column(length=254)
    private String login;
    @Column(length=254)
    private String mp;
    @Column(length=254)
    private String mail;
    @Column(precision=6)
    private BigDecimal idpointage;
    @Column(length=1)
    private Boolean actif;
    public Employe(String nom, String prenom, String login, String mp) {

        this.nom = nom;
        this.prenom = prenom;
        this.login = login;
        this.mp = mp;
    }

это класс EmployeDTO:

public class EmployeDTO {
        private String nom;
        private String prenom;
        private String login ; 
        private String mp ; 


        public EmployeDTO(String nom, String prenom, String login, String mp) {

            this.nom= nom ; 
            this.prenom= prenom ; 
            this.login = login ; 
            this.mp=mp ;
        }
0 голосов
/ 06 февраля 2019

Я вижу несколько потенциальных проблем:

Во-первых, вы звоните

List<Employe> listemp=employeService.findAllEmployeActive();

в getEmployeDTOList() вашего контроллера, но ваш макет Mockito записывается как:

when(employeService.findAll()).thenReturn(employes)

Итак, ваш тест может не работать просто потому, что ваша имитация никогда не происходит.

Во-вторых, вы не высмеяли ModelMapper, который вы автоматически подключили в контроллере.Я думаю, Spring все равно продолжит и заберет этот компонент для вас (кто-то поправит меня, если я ошибаюсь), но в любом случае не рекомендуется, чтобы ваши модульные тесты зависели от внешних библиотек, так как выдолжны касаться только функциональности контроллера.Было бы лучше посмеяться над ModelMapper, чтобы он "всегда" работал, и написать отдельные тесты для проверки ваших сопоставлений.

Я пошел дальше и создал свою собственную версию вашего кода для проверки.Я изменил hasSize на 2, потому что вы использовали только два элемента в вашем примере.

Этот тест работает для меня:

@RunWith(SpringJUnit4ClassRunner.class)
public class EmployeeControllerTest {

    private MockMvc mockMvc;
    @InjectMocks
    private EmployeeController employeeController ; 
    @Mock
    private EmployeeService employeeService;
    @Mock
    private ModelMapper modelMapper;

    @Before
    public void setUp() throws Exception{
        MockitoAnnotations.initMocks(this);
        mockMvc=MockMvcBuilders.standaloneSetup(employeeController).build();
    }

    @Test
    public void testgetAllEmployeeWithModelMapper() throws Exception{
        Employee emp1 = new Employee("Hamza", "Khadhri", "hamza1007", "123");
        Employee emp2 = new Employee("Oussema", "smi", "oussama", "1234");
        List<Employee> Employees= Arrays.asList(emp1, emp2);

        EmployeeDTO dto1 = new EmployeeDTO("Hamza", "Khadhri", "hamza1007", "123");
        EmployeeDTO dto2 = new EmployeeDTO("Oussema", "smi", "oussama", "1234");
        when(modelMapper.map(emp1,EmployeeDTO.class)).thenReturn(dto1);
        when(modelMapper.map(emp2,EmployeeDTO.class)).thenReturn(dto2);

        when(employeeService.findAll()).thenReturn(Employees);


        mockMvc.perform(get("/employe/dto"))
            .andExpect(status().isOk())
            .andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE))
            .andExpect(jsonPath("$", hasSize(2)))
            .andExpect(jsonPath("$[0].nom", is("Hamza")))
            .andExpect(jsonPath("$[0].prenom", is("Khadhri")))
            .andExpect(jsonPath("$[0].login", is("hamza1007")))
            .andExpect(jsonPath("$[0].mp", is("123")))
            .andExpect(jsonPath("$[1].nom", is("Oussema")))
            .andExpect(jsonPath("$[1].prenom", is("smi")))
            .andExpect(jsonPath("$[1].login", is("oussama")))
            .andExpect(jsonPath("$[1].mp", is("1234")));

        verify(employeeService,times(1)).findAll();
        verifyNoMoreInteractions(employeeService);

    }

}

Как видите, я создаю свои собственные объекты DTO и передаю их обратно, так что modelMapper всегда будет вести себя так, как ожидалось для этого модульного теста.

...