【问题标题】:Expected a collection with size 2 but collection size was 0?期望一个大小为 2 但集合大小为 0 的集合?
【发布时间】:2019-04-03 16:43:48
【问题描述】:

我正在编写一些代码来使用 mockito 和 junit 测试 web 服务,所以我在 hasSize(2) 中遇到了一个问题,我已经注入了控制器并调用了 findAll 方法,它返回了一个 Employe 列表,但是错误坚持,在调试模式下它告诉我集合是空的,但是,它不是。 错误是:

java.lang.AssertionError: JSON path "$" Expected: a collection with 大小 但是:集合大小为

这里是类:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class GestionPointage3ApplicationTests {

        private MockMvc mockMvc;
        @InjectMocks
        private EmployeController employeeController ; 
        @Mock
        private EmployeService 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{
            Employe emp1 = new Employe("Hamza", "Khadhri", "hamza1007", "123");
            Employe emp2 = new Employe("Oussema", "smi", "oussama", "1234");
            List<Employe> Employees= Arrays.asList(emp1, emp2);

            EmployeDTO dto1 = new EmployeDTO("Hamza", "Khadhri", "hamza1007", "123");
            EmployeDTO dto2 = new EmployeDTO("Oussema", "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);

        }

    }

这是控制器:

@CrossOrigin(origins = "*", allowedHeaders = "*")
@RestController
@RequestMapping("/employe")
public class EmployeController {

    @Autowired
    private EmployeService employeService;

    @Autowired
    private ModelMapper modelMapper;

    @GetMapping("/dto")
    public List<Employe> findAll() throws Exception{
    return employeService.findAllEmployeActive(); 
    }   
}

方法签名:

public List<Employe>findAll() throws Exception;     
public List<Employe>findAllEmployeActive() throws Exception;

堆栈跟踪错误:

java.lang.AssertionError:预期状态: 但原为: org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:55) 在 org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:82) 在 org.springframework.test.web.servlet.result.StatusResultMatchers.lambda$matcher$9(StatusResultMatchers.java:619) 在 org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:178) 在 com.cynapsys.pointage.GestionPointage3ApplicationTests.testgetAllEmployeeWithModelMapper(GestionPointage3ApplicationTests.java:66) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)在 java.lang.reflect.Method.invoke(未知来源)在 org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 在 org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 在 org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 在 org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 在 org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:73) 在 org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:83) 在 org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 在 org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) 在..

【问题讨论】:

    标签: json spring-boot junit mocking hamcrest


    【解决方案1】:

    当调用findAll() 方法时,您正在模拟EmployeeService 并告诉模拟实例返回Employee 列表(及其两项):

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

    但在EmployeeController 中,您实际上是在EmployeeService 上调用不同的方法:

    return employeService.findAllEmployeActive()
    

    所以,你应该像这样更新你的模拟期望:

    when(employeeService.findAllEmployeActive()).thenReturn(Employees)
    

    【讨论】:

    • 我更改了它,但它错误更改 ti 预期 200 但错误 500
    • @HamzaKhadhri 您能否更新您的问题以包含该 500 错误的堆栈跟踪,还包括 employeService.findAllEmployeActive()employeService.findAll() 的方法签名
    • 您添加了来自测试错误的堆栈跟踪,即失败的断言。我正在寻找你的模拟服务器抛出的 500 Internal Server Error 的堆栈跟踪。
    • 无法写入 HTTP 消息:org.springframework.http.converter.HttpMessageNotWritableException:无法写入 JSON:(是 java.lang.NullPointerException);嵌套异常是 com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (通过引用链: java.util.Arrays$ArrayList[0]->com.cynapsys.pointage.model.Employe["actif "])
    猜你喜欢
    • 2013-03-27
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 2016-06-28
    • 2013-07-30
    • 2023-02-07
    • 1970-01-01
    • 2022-06-15
    相关资源
    最近更新 更多