我是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为参数的程序包专用构造函数,并以该构造函数的形式表示默认构造函数.