【发布时间】:2019-02-05 14:04:38
【问题描述】:
我是单元测试的新手,不知道如何使用 Mockito 和 Junit 使用 Spring 测试 RESTFul API,首先我准备了一个类,其中我使用 @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才能通过测试?
【问题讨论】:
-
你的控制器调用
convertToDto(),它依赖于来自ModelMapper的modelMapper.map()。您还需要模拟该服务调用 -
它在控制器里面?怎么办?
-
今天晚些时候我会看看能不能写一个例子。您基本上需要模拟 modelMapper,并让 Mockito 在任何时候(使用
Mockito.when())被调用时返回虚拟数据,而不是该方法通常返回的任何数据。 -
这很容易确定:如果您直接返回员工列表而不是将它们映射到 DTO 对象,那么操作是否仍然“有效”?如果没有,那么您可能走在正确的轨道上。否则,我怀疑这是我已经提到的,您需要处理
modelMapper服务依赖项 -
或者你可以创建一个间谍并调用实际的服务,如果你可以假设它总是会工作,那么它就可以正常工作。
标签: spring-boot junit mockito hamcrest