有人可以帮我模拟方法中的方法调用
我的代码就像:
public class Service {
public List<Bean> Filter(Bean bean){
List<Bean> Filtered_List = getUtilityService.getBeanList();
//Do something
return beanList;
}
}
现在我想为Service类编写测试用例。我怎么能嘲笑: List Filtered_List = getUtilityService.getBeanList();并在其中设置值。
答案 0 :(得分:3)
干净的解决方案是将UtilityService提取到字段并将模拟传递给构造函数。
public class Service {
private UtilityService utilityService;
public Service(UtilityService utilityService) {
this.utilityService = utilityService;
}
public List<Bean> Filter(Bean bean){
List<Bean> filteredList = utilityService.getBeanList();
//Do something
return beanList;
}
}
您还可以引入一个UtilityServiceFactory并在服务中有一个utilityServiceFactory字段。
public class Service {
private UtilityServiceFactory utilityServiceFactory;
public Service(UtilityServiceFactory utilityService) {
this.utilityServiceFactory = utilityServiceFactory;
}
public List<Bean> Filter(Bean bean){
List<Bean> filteredList = utilityService.create().getBeanList();
//Do something
return beanList;
}
}
如果getUtilityService位于Service类中,则还有一个脏解决方案:partial mock。但我不推荐它。最好重构代码并使用以前的方法之一。
编辑: 使用@InjectMocks进行构造函数注入不是最好的主意,但在这里你是:
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
//other imports
@RunWith(MockitoJUnitRunner.class)
public class ServiceTest {
@Mock
UtilityService utilityService;
@InjectMocks
Service service = new Service(null);
@Test
public void shouldFilterBeans() throws Exception {
//given
given(utilityService.getBeanList()).willReturn(asList(new Bean()));
//when
List<Bean> result = service.filter(new Bean());
//then
assertThat(result).hasSize(1); //probably you want to check something else
}
}
答案 1 :(得分:0)
Filter
方法,只需将Bean
实例传递给它,然后断言返回的{{1 object等于你的预期结果。通常,对于这种方法,我认为不需要使用模拟框架。List<Bean>
方法调用,你应该重构你的代码:
getUtilityService().getBeanList()
及其相应的setter方法在您的班级UnitilityService service
Service
方法返回一个值,然后调用getBeanList()
方法,最后验证方法调用。详细的实现,你可以参考@woru的答案。