gpt4 book ai didi

java - 你能模拟一个使用 Mockito 调用静态方法的非静态方法吗?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:50:10 25 4
gpt4 key购买 nike

我知道您不能使用 mockito 模拟静态方法。但是我试图模拟的方法不是静态的,但它调用了静态方法。那么我可以模拟这个方法吗?

我在运行测试时遇到异常。调用静态方法是这个异常的原因吗?

要测试的类:

public class MyAction{
public ActionForward search(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
MyService service = new MyService();
**form.setList(service.getRecords(searchRequest));**
}
}

模拟类和方法:

public class MyService{
public List getRecords(SearchRequest sr){
List returnList = new ArrayList();
MyDao dao = DAOFactory.getInstance().getDAO();---->Call to static method
// Some codes
return returnList;
}
}

静态方法类:

public class DAOFactory{
private static DAOFactory instance = new DAOFactory();

public static DAOFactory getInstance() {------> The static method
return instance;
}
}

我的测试:

@Test
public void testSearch() throws Exception{
MyService service = mock(MyService.class);
MyAction action = new MyAction();

List<MyList> list = new ArrayList<MyList>();
when(service.getRecords(searchRequest)).thenReturn(list);
ActionForward forward = action.search(mapping, form, request, response);
}

这是我运行测试时的堆栈跟踪。请记住,为简单起见,我更改了类的名称。 enter image description here

最佳答案

问题是您的search 方法无法使用服务模拟,因为它通过MyService service = new MyClass(); 创建了自己的实例。因此,您必须重构 MyAction 类以允许 MyService 注入(inject)并在其中注入(inject)模拟。或者使用更重的武器——PowerMock。

最简单和最安全的重构

在您的 IDE 中使用“提取方法”重构来提取构造“new MyClass()”。所以会变成:

public class MyAction{
public ActionForward search(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
MyService service = getMyService();
**form.setList(service.getRecords(searchRequest));**
}
MyService getMyService() {
return new MyClass();
}

}

然后在您的单元测试中,您可以通过创建内部子类来注入(inject)模拟:

public class MyActionTest {
private MyService service = mock(MyService.class);
private MyAction action = new MyAction(){
@Override
MyService getMyService() {return service;}
};

@Test
public void testSearch() throws Exception{

List<MyList> list = new ArrayList<MyList>();
when(service.getRecords(searchRequest)).thenReturn(list);
ActionForward forward = action.search(mapping, form, request, response);
}

}

关于java - 你能模拟一个使用 Mockito 调用静态方法的非静态方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14510358/

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