使用 Mockito,如何在 when 子句中检查映射的键值对
Using Mockito, how do I check for a key-value pair of a map within when clause
参考:SimilarQuestion1, SimilarQuestion2, SimilarQuestion3
从参考资料中,我能够得出如下的部分解决方案,尽管它在语法上是不正确的。
我如何修改它以正确搜索具有空值的某些键。
when(storedProc.execute(anyMapOf(String.class, Object.class).allOf(hasEntry("firstIdentifier", null), hasEntry("secondIdentifier", null))))
.thenThrow(new Exception(EXCEPTION_NO_IDENTIFIER));
任何帮助将不胜感激。
在您的情况下,您可以使用 eq
和提供的填充地图:
when(storedProc.execute(Mockito.eq(givenIncorrectMap)))
.thenThrow(new Exception(EXCEPTION_NO_IDENTIFIER));
完整示例:
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.mockito.Mockito;
import static org.mockito.Mockito.when;
public class QuestionTest {
@Rule
public ExpectedException exception = ExpectedException.none();
interface A {
String execute(Map<String, Object> map);
}
@Test
public void test() {
// Given a map with missed identifiers.
final Map<String, Object> givenIncorrectMap = new HashMap<>();
givenIncorrectMap.put("firstIdentifier", null);
givenIncorrectMap.put("secondIdentifier", null);
// Given a mocked service
final A mockedA = Mockito.mock(A.class);
// which throws an exception exactly for the given map.
when(mockedA.execute(Mockito.eq(givenIncorrectMap)))
.thenThrow(new IllegalArgumentException("1"));
// Now 2 test cases to compare behaviour:
// When execute with correct map no exception is expected
mockedA.execute(Collections.singletonMap("firstIdentifier", "any correct value"));
// When execute with incorrect map the IllegalArgumentException is expected
exception.expect(IllegalArgumentException.class);
exception.expectMessage("1");
mockedA.execute(givenIncorrectMap);
}
}
问题是 anyMap
returns 一个 Map 而不是 Matcher。因此,将您的 anyMap(...)...
替换为:
Mockito.argThat(CoreMatchers.allOf(
hasEntry("firstIdentifier", null),
hasEntry("secondIdentifier", null)))
也许你必须添加一些类型变量提示,这样它才能编译。
参考:SimilarQuestion1, SimilarQuestion2, SimilarQuestion3
从参考资料中,我能够得出如下的部分解决方案,尽管它在语法上是不正确的。 我如何修改它以正确搜索具有空值的某些键。
when(storedProc.execute(anyMapOf(String.class, Object.class).allOf(hasEntry("firstIdentifier", null), hasEntry("secondIdentifier", null))))
.thenThrow(new Exception(EXCEPTION_NO_IDENTIFIER));
任何帮助将不胜感激。
在您的情况下,您可以使用 eq
和提供的填充地图:
when(storedProc.execute(Mockito.eq(givenIncorrectMap)))
.thenThrow(new Exception(EXCEPTION_NO_IDENTIFIER));
完整示例:
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.mockito.Mockito;
import static org.mockito.Mockito.when;
public class QuestionTest {
@Rule
public ExpectedException exception = ExpectedException.none();
interface A {
String execute(Map<String, Object> map);
}
@Test
public void test() {
// Given a map with missed identifiers.
final Map<String, Object> givenIncorrectMap = new HashMap<>();
givenIncorrectMap.put("firstIdentifier", null);
givenIncorrectMap.put("secondIdentifier", null);
// Given a mocked service
final A mockedA = Mockito.mock(A.class);
// which throws an exception exactly for the given map.
when(mockedA.execute(Mockito.eq(givenIncorrectMap)))
.thenThrow(new IllegalArgumentException("1"));
// Now 2 test cases to compare behaviour:
// When execute with correct map no exception is expected
mockedA.execute(Collections.singletonMap("firstIdentifier", "any correct value"));
// When execute with incorrect map the IllegalArgumentException is expected
exception.expect(IllegalArgumentException.class);
exception.expectMessage("1");
mockedA.execute(givenIncorrectMap);
}
}
问题是 anyMap
returns 一个 Map 而不是 Matcher。因此,将您的 anyMap(...)...
替换为:
Mockito.argThat(CoreMatchers.allOf(
hasEntry("firstIdentifier", null),
hasEntry("secondIdentifier", null)))
也许你必须添加一些类型变量提示,这样它才能编译。