我在当前项目中使用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是一个带有私有构造函数的类。它有一个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.
有人可以帮我解决这个问题。我坚持这个问题,无法在SO上找到任何合适的解决方案。
由于
答案 0 :(得分:1)
我认为异常说明了大多数解决方案..因为你在嘲笑静态方法,所以建议使用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();
这样的东西来获取一个对象,然后将它标记为深存根调用的结果......然后执行你需要的任何东西在它上面。
<强>另外强>
如果您想模拟execute()
方法,那么您可以再次使用PowerMockito来实现此目的:
@RunWith(PowerMockRunner.class)
@PrepareForTest( { ProcessCall.class })
public class MyTest{
@Test
public void ProcessPost(){
System.out.println("--------------------------");
ProcessCall processCallInstance = PowerMockito.mock(ProcessCall.class);