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 您想要的任何值。
如果参数具有具体 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 您想要的任何值。