服务对象没有用数据模拟?
Service object not mocked with data?
Service object not mocked from controller testcase return empty object here is the below code
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Main.class)
@WebAppConfiguration
@ActiveProfiles(ApplicationConstants.DEVELOPMENT_PROFILE)
public class EmployeeControllerTest {
@Autowired
private WebApplicationContext webAppContext;
private MockMvc mockMvc;
@Mock
EmployeeCompositeService employeeCompositeService;
@InjectMocks
EmployeeController employeeController;
String name = "mike";
@Before
public void setUp() throws Exception {
mockMvc = MockMvcBuilders.webAppContextSetup(webAppContext).build();
MockitoAnnotations.initMocks(this);
}
@Test
public void testGetEmployees() throws Exception {
Mockito.when(employeeCompositeService.getEmployeesByName(name)).thenReturn(getEmployees());
String url = URIConstants.ROOT_CONTEXT + URIConstants.EMPLOYEE;
MvcResult result =
mockMvc.perform(post(url)
.contentType(APPLICATION_JSON_UTF8)
.content(convertObjectToJsonBytes(name))
.andExpect(status().isOk())
.andExpect(content().contentType(APPLICATION_JSON_UTF8))
.andExpect(jsonPath("$[0].employeeName").value("Mike"))
.andReturn();
String jsonContent = result.getResponse().getContentAsString();
LOGGER.debug("jsonContent: {}",jsonContent);
}
protected byte[] convertObjectToJsonBytes(Object object) throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
return mapper.writeValueAsBytes(object);
}
private List<Employee> getEmployees(){
//here is the logic to get List of employees to return. When the mockito call is invoked.
}
}
@RestController
@RequestMapping(value = URIConstants.ROOT_CONTEXT)
public EmployeeController{
@Autowired
private EmployeeCompositeService employeeCompositeService;
@RequestMapping(value=URIConstants.EMPLOYEE, method=RequestMethod.POST, consumes = INPUT_FORMAT, produces = OUTPUT_FORMAT)
public List<Employees> getEmployees(@RequestBody String name){
return employeeCompositeService.getEmployeesByName(name); //When invoke this method it calls inner service but not returns the mocked object.
}
}
我在 EmployeeController 端有一个服务调用,即
employeeCompositeService.getEmployees(String name)
所以我在 EmployeeControllerTestcase 中进行了模拟,即
@Mock EmployeeCompositeService employeeCompositeService;
当我 运行 控制器测试用例时,它调用进一步的服务调用和存储库并访问数据库
所以我不想调用内部服务 returns 来自控制器的此调用 employeeCompositeService.getEmployeesByName(name);
的结果。
你能告诉我我在上面的代码中做错了什么提前致谢
EmployeeCompositeService
模拟对象已创建,但未注入到任何地方。这是在测试中初始化一个 class 成员,但由于它没有被注入到控制器中,因此正在使用真实的、面向数据库的实现。要将模拟注入控制器,请在测试中将控制器声明为 class 成员,并使用 org.mockito.InjectMocks
注释对其进行注释。这将从带有 @Mock
注释的测试中获取 class 成员,并将它们注入到实现相同接口的控制器字段中。
下一步是将控制器注入 MockMvc
对象,方法是将其指定为 mockMvc = MockMvcBuilders.standaloneSetup(employeeController).build()
。
Service object not mocked from controller testcase return empty object here is the below code
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Main.class)
@WebAppConfiguration
@ActiveProfiles(ApplicationConstants.DEVELOPMENT_PROFILE)
public class EmployeeControllerTest {
@Autowired
private WebApplicationContext webAppContext;
private MockMvc mockMvc;
@Mock
EmployeeCompositeService employeeCompositeService;
@InjectMocks
EmployeeController employeeController;
String name = "mike";
@Before
public void setUp() throws Exception {
mockMvc = MockMvcBuilders.webAppContextSetup(webAppContext).build();
MockitoAnnotations.initMocks(this);
}
@Test
public void testGetEmployees() throws Exception {
Mockito.when(employeeCompositeService.getEmployeesByName(name)).thenReturn(getEmployees());
String url = URIConstants.ROOT_CONTEXT + URIConstants.EMPLOYEE;
MvcResult result =
mockMvc.perform(post(url)
.contentType(APPLICATION_JSON_UTF8)
.content(convertObjectToJsonBytes(name))
.andExpect(status().isOk())
.andExpect(content().contentType(APPLICATION_JSON_UTF8))
.andExpect(jsonPath("$[0].employeeName").value("Mike"))
.andReturn();
String jsonContent = result.getResponse().getContentAsString();
LOGGER.debug("jsonContent: {}",jsonContent);
}
protected byte[] convertObjectToJsonBytes(Object object) throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
return mapper.writeValueAsBytes(object);
}
private List<Employee> getEmployees(){
//here is the logic to get List of employees to return. When the mockito call is invoked.
}
}
@RestController
@RequestMapping(value = URIConstants.ROOT_CONTEXT)
public EmployeeController{
@Autowired
private EmployeeCompositeService employeeCompositeService;
@RequestMapping(value=URIConstants.EMPLOYEE, method=RequestMethod.POST, consumes = INPUT_FORMAT, produces = OUTPUT_FORMAT)
public List<Employees> getEmployees(@RequestBody String name){
return employeeCompositeService.getEmployeesByName(name); //When invoke this method it calls inner service but not returns the mocked object.
}
}
我在 EmployeeController 端有一个服务调用,即
employeeCompositeService.getEmployees(String name)
所以我在 EmployeeControllerTestcase 中进行了模拟,即
@Mock EmployeeCompositeService employeeCompositeService;
当我 运行 控制器测试用例时,它调用进一步的服务调用和存储库并访问数据库
所以我不想调用内部服务 returns 来自控制器的此调用 employeeCompositeService.getEmployeesByName(name);
的结果。
你能告诉我我在上面的代码中做错了什么提前致谢
EmployeeCompositeService
模拟对象已创建,但未注入到任何地方。这是在测试中初始化一个 class 成员,但由于它没有被注入到控制器中,因此正在使用真实的、面向数据库的实现。要将模拟注入控制器,请在测试中将控制器声明为 class 成员,并使用 org.mockito.InjectMocks
注释对其进行注释。这将从带有 @Mock
注释的测试中获取 class 成员,并将它们注入到实现相同接口的控制器字段中。
下一步是将控制器注入 MockMvc
对象,方法是将其指定为 mockMvc = MockMvcBuilders.standaloneSetup(employeeController).build()
。