如何在我正在编写junit test的方法中模拟方法调用

时间:2015-08-10 10:57:26

标签: java junit

有人可以帮我模拟方法中的方法调用

我的代码就像:

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();并在其中设置值。

2 个答案:

答案 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>方法调用,你应该重构你的代码:
    • addfield getUtilityService().getBeanList()及其相应的setter方法在您的班级UnitilityService service
    • 在您的单元测试代码中,使用setter方法将模拟服务注入到测试对象中,并为其Service方法返回一个值,然后调用getBeanList()方法,最后验证方法调用。详细的实现,你可以参考@woru的答案。