java-使用Mockito模拟内部方法

我是Mockito的新手.
我试图通过模拟数据库交互来为服务编写jnuit:

我有以下课程(仅代表实际课程)

public class TestService{

    public Response getTestList(String type){
        list = getListbyType(type);

        return response.entity(list);
    }

    private List getListbyType(String type){
          ...
          ..
          TestDAO testdao = new Testdao(sqlconn);
          list = testdao.getListfromDB(type)
          return list;
   }
}

我的测试课是这样的

public class TestServiceTest{

    @InjectMocks
    private TestService testService = new TestService();
    @Test
    public void getTestListTest(){

        List testlist = new List();
        tetslist.add("test1");

        TestDAO testdaomock = mock(TestDAO);
        when(testdaomock.getListfromDB("test")).thenreturn(list);

        list = testService.getTestList(test);
    }
}

但是,当我运行此测试时,它仍会调用实际的数据库调用并从db而不是模拟值中检索值,我应该模拟sql连接和非默认构造函数吗?我无能为力.

-更新

正如人们所建议的那样,我将DAO实例移到我的服务构造函数中,并且还使用了Spy,但是仍然调用实际的DB调用而不是模拟调用.

解决方法:

您的问题在于以下语句:

TestDAO testdao = new Testdao(sqlconn);

您从mock()获得的TestDAO实例不是在new之后的testdao.getListfromDB(type)中使用的实例.

为了成功进行模拟,您需要始终应用依赖项的反转.这意味着new只能显示在您不想测试的类中,例如简单的工厂或Spring配置文件.

[更新]

如果没有适当的IOC,则可以引入分配DAO的方法,然后对其进行spy().该方法必须是私有程序包.描述为here.

另一种选择是添加一个以testdao为参数的程序包专用构造函数,并以该构造函数的形式表示默认构造函数.

上一篇:java-使用Mockito对DAO层进行单元测试


下一篇:java-单元测试ContainerRequestFilter,它将ResourceInfo与Mockito一起使用