【发布时间】:2016-08-15 18:38:08
【问题描述】:
我是 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 调用并从 db 中检索值而不是模拟值,我应该模拟 sql 连接和非默认构造函数吗?我一无所知。
-- 更新
正如人们所建议的,我将 DAO 实例化移至我的服务构造函数并使用了 Spy,但仍然调用了我的实际 DB 调用而不是模拟调用。
【问题讨论】:
-
testdaomock.getListfromDB("test")不应编译,因为private List getListbyType(String type)是私有的。它是如何编译的? -
getListbyType(String type) 是私有的,但是 testdaomock.getListfromDB("test") 是在公共的 DAO 类中
-
@RunWith(MockitoJUnitRunner.class) -
这个测试的问题实际上是被测代码的糟糕设计:不应在对“getter”的调用中实例化任何 DAO。该 DAO 实例的唯一位置是一个字段,在构造时实例化或在需要时延迟实例化(测试将执行前者)。