elasticsearch,junit,mockito,Java,elasticsearch,Junit,Mockito" /> elasticsearch,junit,mockito,Java,elasticsearch,Junit,Mockito" />

Java Mockito MissingMethodInvocation异常

Java Mockito MissingMethodInvocation异常,java,elasticsearch,junit,mockito,Java,elasticsearch,Junit,Mockito,我知道我的问题有很多类似的问题/答案,但我仍然无法通过测试解决这个问题 问题: 我试图模拟设置类,但Mockito抱怨这一行: when(settings.settingsBuilder().put(new String("test"), "test").build()).thenReturn(settings) MissingMethodInvocation异常: org.mockito.exceptions.misusing.MissingMethodInvocationException

我知道我的问题有很多类似的问题/答案,但我仍然无法通过测试解决这个问题

问题: 我试图模拟设置类,但Mockito抱怨这一行:

when(settings.settingsBuilder().put(new String("test"), "test").build()).thenReturn(settings)
MissingMethodInvocation异常:

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

Also, this error might show up because:
1. you stub either of: final/private/equals()/hashCode() methods.
 Those methods *cannot* be stubbed/verified.
 Mocking methods declared on non-public parent classes is not supported.
2. inside when() you don't call method on mock but on some other object.
我尝试了许多可能的方法,但没有结果。以下是实际的测试方法

@RunWith(PowerMockRunner.class)
@PrepareForTest({Settings.class, Client.class})
public class AddressMatcherElasticTest {

private final AddressWebConfiguration configuration = mock(AddressWebConfiguration.class);
private final Settings settings = mock(Settings.class);
private final Client client = mock(Client.class);

  @Test
  public void match() throws Exception {
   when(configuration.getClusterName()).thenReturn(new String("name"));
   when(settings.settingsBuilder().put(new String("name"), "test").build()).thenReturn(settings);
   AddressMatcherElastic test = new AddressMatcherElastic(configuration);
   verify(configuration, times(1)).getClusterName();
 }
}

settings
是您的mock,您可以告诉Mockito如果调用它,将返回什么

settings.settingsBuilder()
不会返回模拟,而这正是Mockito所抱怨的。当调用
settingsBuilder
时,您可以告诉Mockito返回模拟对象,例如

Builder settingsBuilder = mock(Builder.class);
when(settingsBuilder.doX()).thenReturn(...);
when(settings.settingsBuilder()).thenReturn(settingsBuilder);
注意,如果您没有声明其他内容,那么对象引用的mock默认情况下将返回null