我有一个类,例如SimpleClass,它具有两个具有相同名称和相同参数数量但具有不同参数类型的函数。现在,我假设模拟它们的返回值应该像使用两个带有适当匹配器的when语句一样,但是当我尝试得到以下错误时,该方法是:


  org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
  在此处检测到错误的参数匹配器:
  
  ->在嘲笑.MockTest.whenMethodsHaveSimilarSignatures(MockTest.java:28)
  ->在嘲笑.MockTest.whenMethodsHaveSimilarSignatures(MockTest.java:28)


这是我正在尝试的示例:

public class SimpleClass {

    public boolean doWork(String value, String name) {
        return false;
    }

    public boolean doWork(Integer value, String name) {
        return true;
    }
}



@RunWith(MockitoJUnitRunner.class)
public class MockTest {

    private SimpleClass thing;

    @Before
    public void setup() {

        thing = new SimpleClass();
    }

    @Test
    public void whenMethodsHaveSimilarSignatures() {

        when(thing.doWork(anyString(), anyString())).thenReturn(true);
        when(thing.doWork(any(Integer.class), anyString())).thenReturn(false);

        assertThat(thing.doWork("one", "name")).isTrue();
        assertThat(thing.doWork(1, "name")).isFalse();
    }
}


虽然我不是Mockito的向导,但我已经使用了一段时间,从未遇到此问题。有什么想法吗?我正在使用Mockito-Core v2.2.9

最佳答案

在对重载的方法进行存根处理时,请勿使用any(Object.class),因为StringInteger都是Object的子类,因此在存根处理期间指定特定的参数。也可以使用ArgumentMatchers

when(thing.doWork(ArgumentMatchers.anyString(), ArgumentMatchers.anyString())).thenReturn(true);
when(thing.doWork(ArgumentMatchers.any(Integer.class), anyString())).thenReturn(false);


而且你也不嘲笑SimpleClass

@RunWith(MockitoJUnitRunner.class)
public class MockTest {

private SimpleClass thing = Mockito.mock(SimpleClass.Class);

@Before
public void setup() {

    MockitoAnnotations.initMocks(this);  // need to enable these annotations programmatically
}

@Test
public void whenMethodsHaveSimilarSignatures() {

    when(thing.doWork(anyString(), anyString())).thenReturn(true);
    when(thing.doWork(any(Integer.class), anyString())).thenReturn(false);

 //or

   when(thing.doWork(ArgumentMatchers.anyString(), ArgumentMatchers.anyString())).thenReturn(true);
   when(thing.doWork(ArgumentMatchers.any(Integer.class), anyString())).thenReturn(false);

    assertThat(thing.doWork("one", "name")).isTrue();
    assertThat(thing.doWork(1, "name")).isFalse();
    }
 }

10-06 03:42