Java JUnit Mockito与H2数据库
我正在尝试使用Mockito框架为spring引导控制器编写JUnit。我已经注入了服务类。我正在使用嵌入式h2数据库 当我尝试调试编写的测试用例时,我可以看到它没有调用服务方法的实现类并返回空数组。我已经附上了控制器类的调试截图 下面是编写的JUnit类文件:-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;
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>());