gpt4 book ai didi

java - 使用 Mockito 模拟内部方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:05:20 28 4
gpt4 key购买 nike

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

我有以下类(class)(仅代表实际类(class))

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);
}
}

但是当我运行这个测试时,它仍然调用实际的数据库调用并从数据库中检索值而不是模拟值,我应该模拟 sql 连接和非默认构造函数吗?我一无所知。

-- 更新

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

最佳答案

您的问题在于以下语句:

TestDAO testdao = new Testdao(sqlconn);

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

为了成功模拟,您需要在整个过程中应用依赖关系的反转。这意味着 new 必须只出现在您不打算测试的类中,例如简单的工厂或 Spring 配置文件。

[更新]

如果适当的 IOC 不是一个选项,您可以引入一种分配 DAO 的方法,然后 spy() 它。该方法必须是包私有(private)的。这是描述here .

另一种选择是添加一个包私有(private)的构造函数,将 testdao 作为参数,并用该构造函数的术语表达您的默认构造函数。

关于java - 使用 Mockito 模拟内部方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38960934/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com