Java JUnit Mockito与H2数据库

Java JUnit Mockito与H2数据库,java,spring,junit,Java,Spring,Junit,我正在尝试使用Mockito框架为spring引导控制器编写JUnit。我已经注入了服务类。我正在使用嵌入式h2数据库 当我尝试调试编写的测试用例时,我可以看到它没有调用服务方法的实现类并返回空数组。我已经附上了控制器类的调试截图 下面是编写的JUnit类文件:- package com.testSpringBoot; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

我正在尝试使用Mockito框架为spring引导控制器编写JUnit。我已经注入了服务类。我正在使用嵌入式h2数据库

当我尝试调试编写的测试用例时,我可以看到它没有调用服务方法的实现类并返回空数组。我已经附上了控制器类的调试截图

下面是编写的JUnit类文件:-

package com.testSpringBoot;

import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import java.util.ArrayList;
import java.util.List;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import com.testSpringBoot.controller.EmployeeController;
import com.testSpringBoot.dto.EmployeeDTO;
import com.testSpringBoot.repository.EmployeeRepository;
import com.testSpringBoot.service.EmployeeService;

import junit.framework.Assert;

@RunWith(SpringRunner.class)
@SpringBootTest
public class EmployeeControllerJUnit {

    private MockMvc mockMvc;

    @Mock
    private EmployeeService employeeService;

    @InjectMocks
    private EmployeeController employeeController;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);

        mockMvc = MockMvcBuilders.standaloneSetup(employeeController).build();
    }

    @Test
    public void employeeControllerTest() throws Exception {
        Mockito.when(employeeService.getAllEmployees()).thenReturn(new ArrayList<EmployeeDTO>());

        mockMvc.perform(MockMvcRequestBuilders.get("/employee/getAllEmployees"))
        .andExpect(status().isOk());
    }   
}
package com.testSpringBoot;
导入静态org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
导入java.util.ArrayList;
导入java.util.List;
导入org.junit.Before;
导入org.junit.Ignore;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.mockito.InjectMocks;
导入org.mockito.Mock;
导入org.mockito.mockito;
导入org.mockito.MockitoAnnotations;
导入org.springframework.boot.test.context.SpringBootTest;
导入org.springframework.test.context.junit4.SpringRunner;
导入org.springframework.test.web.servlet.MockMvc;
导入org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
导入org.springframework.test.web.servlet.setup.MockMvcBuilders;
导入com.testSpringBoot.controller.EmployeeController;
导入com.testSpringBoot.dto.EmployeeDTO;
导入com.testSpringBoot.repository.EmployeeRepository;
导入com.testSpringBoot.service.EmployeeService;
导入junit.framework.Assert;
@RunWith(SpringRunner.class)
@春靴测试
公共类EmployeeControllerJUnit{
私有MockMvc-MockMvc;
@嘲弄
私人雇员服务;
@注射模拟
私人雇员控制人雇员控制人;
@以前
公共作废设置(){
initMocks(this);
mockMvc=MockMvcBuilders.standaloneSetup(employeeController.build();
}
@试验
public void employeeControllerTest()引发异常{
Mockito.when(employeeService.getAllEmployees()).thenReturn(newarraylist());
mockMvc.perform(MockMvcRequestBuilders.get(“/employee/getAllEmployees”))
.andExpect(status().isOk());
}   
}
控制器文件处的调试屏幕截图:-

你能告诉我哪里出错了吗

谢谢

这将指示Mockito JUnit runner创建
EmployeeService
类型的模拟。模拟不使用可以在
EmployeeService
类中编写的任何实现(或者如果
EmployeeService
是接口,则在其任何实现中编写)。相反,它只是“模仿”该类的行为

在这里,当调用mock的
getAllEmployees()
方法时,您指示mock返回一个空列表:

Mockito.when(employeeService.getAllEmployees()).thenReturn(new ArrayList<EmployeeDTO>());
Mockito.when(employeeService.getAllEmployees()).thenReturn(new ArrayList());
根据你的描述,它就是这样


您需要决定是否需要模拟您的服务。如果没有,不要使用Mockito的Mock,只使用您的服务实现(尽管这会将您的测试转换为集成测试)。

很好的解释。多谢。从上面的解释中,我们得到了嘲弄的确切定义。再一次澄清。总而言之:我是Junit的新手。所以请容忍我。事情是这样的,所以我可以认为,与mockito Junit,我们将只是玩弄预定义的对象只?因为在调用实际实现之前,如果调用了特定的方法,我们将指示junit返回此对象。对于mock,您根本不使用协作者的实际实现(在您的例子中是服务)。例如,在您的例子中,您测试一个只直接依赖于服务层的控制器。所以,如果您可以通过服务层模拟来模拟所需的一切,那么为什么还要麻烦DAO层呢。
Mockito.when(employeeService.getAllEmployees()).thenReturn(new ArrayList<EmployeeDTO>());