使用模拟测试的空服务响应

时间:2019-01-24 15:25:20

标签: java spring testing mocking

我有一项服务,可以在存储库中找到一个对象并返回该对象的一个​​属性。 我想尝试测试服务模拟访问存储库,但是当我调用服务方法时返回null。

我的服务:

@Service
public class MyService{

    public Object getModuleObj(String id, String module) {
        Object repObj = Repository.findOne(id,module);
        return repObj.getModule();
    }
}

我的考试班:

    @RunWith(SpringJUnit4ClassRunner.class)
    @WebMvcTest(MyController.class)
    @ContextConfiguration(classes = AnnotationConfigContextLoader.class)
    public class ApiTest {

        @MockBean
        public MyRepository repository;

        @MockBean
        private MyService service;

        @Test
        public void testGetObjectOfRepo() throws Exception {
            Object obj = new Object();
            Module mod = new Module();
            mod.setId("6");
            mod.setModule("test");
            obj.add(mod);

            /** mock repository response **/
            Mockito.when(repository.findOne("6","test")).thenReturn(obj);

            /** invoke service method**/
            String module= "test";
            /** serviceResponse return null **/
            Module serviceResponse = this.service.getModuleObj("6","test");
            Assert.assertEquals(mod, serviceResponse);
        }


        }

对象之间的比较失败,因为serviceResponse为空。我在嘲笑存储库是正确的吗?

2 个答案:

答案 0 :(得分:0)

您不能使用Mockito模拟静态方法。如果要测试getModuleObj方法,则必须像下面这样提取对非静态方法的静态调用:

@Service
public class MyService{

    public Object getModuleObj(String id, String module) {
        Object repObj = this.findOne(id,module);
        return repObj.getModule();
    }

    Object findOne(String id, String module){
        return Repository.findOne(id,module);
    }
}

然后您可以通过创建间谍来测试方法的其余部分:

@Test
public void testGetObjectOfRepo() throws Exception {
    MyService service = spy(MyService.class);
    Object obj = new Object();
    //initialize the obj
    doReturn(obj).when(service.findOne(anyString(), anyString()));

    Module serviceResponse = service.getModuleObj("6","test");
    //asertions
}

我不确定这是否是您的意图,因为您的代码似乎有点混乱。我真的希望您不要创建类Object,因为java.lang.Object没有方法add

答案 1 :(得分:0)

我正在使用ReflectionTestUtils解决在服务中注入存储库访问的问题。 测试类的代码:

@Test
public void testMyService() throws Exception {
Object obj = new Object();
            Module mod = new Module();
            mod.setId("6");
            mod.setModule("test");
            obj.add(mod);

            /** mock repository response **/
            Mockito.when(repository.findOne("6","test")).thenReturn(obj);
            /** inject mock repository in service*/
            ReflectionTestUtils.setField(this.service, null, "filterRepository", repository, null); 
//Asserts
}