gpt4 book ai didi

java - Java/Mockito 中的模拟链式方法调用

转载 作者:行者123 更新时间:2023-11-30 06:53:25 25 4
gpt4 key购买 nike

我在当前项目中使用 Mockito 来模拟服务。我有一个场景,我需要在代码中模拟链式方法。链式方法使用流畅的设计模式。代码如下。我找不到满足我要求的解决方案。

ProcessCall setValue = ProcessCall.url("").http(HttpMethod.GET).contentType(null).reqHeaders(null).payload(null).create();

我正在尝试像下面这样模拟上面的代码

   @Test
public void ProcessPost(){
System.out.println("--------------------------");
ProcessCall procCall= Mockito.mock(ProcessCall.class, Mockito.RETURNS_DEEP_STUBS);
Mockito.when(ProcessCall .url("").http(HttpMethod.GET).contentType(null).reqHeaders(null).payload(null).create()).thenReturn(??);

}

不确定在 thenReturn(??) 方法中传递什么。ProcessCall 是一个具有私有(private)构造函数的类。它有一个execute() 方法,我需要从调用结果中执行该方法。我收到以下错误:

  org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'.
For example:
when(mock.getArticles()).thenReturn(articles);
Or 'a static method call on a prepared class`
For example:
@PrepareForTest( { StaticService.class })
TestClass{
public void testMethod(){
PowerMockito.mockStatic(StaticService.class);
when(StaticService.say()).thenReturn(expected);
}
}

Also, this error might show up because:
1. inside when() you don't call method on mock but on some other object.
2 . inside when() you don't call static method, but class has not been prepared.

有人可以帮我解决这个问题吗?我被这个问题困扰,找不到任何合适的解决方案。

谢谢

最佳答案

我认为异常说明了解决方案的大部分内容..当您模拟静态方法时,建议使用 PowerMockito (您将需要添加适当的依赖项),然后在测试中:

@RunWith(PowerMockRunner.class)
@PrepareForTest( { ProcessCall.class })
public class MyTest{

@Test
public void ProcessPost(){
System.out.println("--------------------------");
ProcessCall processCallInstance = ProcessCall.getInstance();
ProcessCall procCall= PowerMockito.mockStatic(ProcessCall.class
, Mockito.RETURNS_DEEP_STUBS);
Mockito.when(ProcessCall .url("").http(HttpMethod.GET)
.contentType(null).reqHeaders(null).payload(null).create())
.thenReturn(processCallInstance);
...
processCallInstance.execute();
...
}

由于我假设 ProcessCall 是一个单例,因此您需要使用 ProcessCall.getInstance(); 之类的东西来获取一个对象,然后将其标记为深度 stub 调用...然后执行您需要的任何内容。

另外

如果您想模拟 execute() 方法,那么您可以再次使用 PowerMockito 来实现此目的:

@RunWith(PowerMockRunner.class)
@PrepareForTest( { ProcessCall.class })
public class MyTest{

@Test
public void ProcessPost(){
System.out.println("--------------------------");
ProcessCall processCallInstance = PowerMockito.mock(ProcessCall.class);

关于java - Java/Mockito 中的模拟链式方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42279516/

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