Return 来自 mock 的不同值,具体取决于参数

Return different values from mock, depending on args

如果参数具有具体 class,我正在尝试制作应该 return 不同值的模拟。我创建了 tableVerificationService 模拟对象并在条件时创建了这些对象。

Mockito.when(tableVerificationService.verify(Mockito.any())).thenReturn(true);
Mockito.when(tableVerificationService.verify(Mockito.any(DTable.class))).thenReturn(false);

但现在它 return 在任何情况下都是错误的,即使我从 DTable 对象传递另一个。

如果我更改这两行的顺序,它将在所有情况下 return 为真。有什么方法可以做出正确的行为吗?

您可以使用 .thenAnswer().then()(更短)来更好地控制 returned 值。

举个例子可能会更好地说明这一点。

假设我们要模拟 Java class:

public class OtherService {

  public String doStuff(String a) {
    return a;
  }
}

... 如果传递的 String 为偶数,我们希望 return “偶数”,否则为“不偶数”。

通过使用 .then() 我们可以访问 InvocationOnMock 并可以访问传递的参数。这有助于确定 returned 值:

class MockitoExampleTest {

  @Test
  void testMe() {

    OtherService otherService = Mockito.mock(OtherService.class);

    when(otherService.doStuff(ArgumentMatchers.anyString())).then(invocationOnMock -> {
      String passedString = invocationOnMock.getArgument(0);

      if (passedString.length() % 2 == 0) {
        return "even";
      } else {
        return "uneven";
      }
    });

    System.out.println(otherService.doStuff("duke")); // even
    System.out.println(otherService.doStuff("egg")); // uneven

  }
}

使用此技术,您可以检查传递的参数并确定它是否是您的具体 class,然后 return 您想要的任何值。