简体   繁体   English

使用Mockito,如何在when子句中检查映射的键值对

[英]Using Mockito, how do I check for a key-value pair of a map within when clause

Referred to: SimilarQuestion1 , SimilarQuestion2 , SimilarQuestion3 引用: 相似问题1相似问题2相似问题3

From the reference, I was able to derive a partial solution as follows, though it is syntactically incorrect. 从参考文献中,我可以得出如下的部分解决方案,尽管它在语法上是不正确的。 How do I modify this to correctly search for certain keys with null values. 如何修改它以正确搜索具有空值的某些键。

when(storedProc.execute(anyMapOf(String.class, Object.class).allOf(hasEntry("firstIdentifier", null), hasEntry("secondIdentifier", null))))
   .thenThrow(new Exception(EXCEPTION_NO_IDENTIFIER));

Any help will be appreciated. 任何帮助将不胜感激。

In your case you can use eq with provided filled map: 您可以将eq与提供的填充图一起使用:

    when(storedProc.execute(Mockito.eq(givenIncorrectMap)))
            .thenThrow(new Exception(EXCEPTION_NO_IDENTIFIER));

Full example: 完整示例:

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

The problem is that anyMap returns a Map and not a Matcher. 问题是anyMap返回一个Map而不是Matcher。 So replace your anyMap(...)... by: 因此,将您的anyMap(...)...替换为:

Mockito.argThat(CoreMatchers.allOf(
  hasEntry("firstIdentifier", null), 
  hasEntry("secondIdentifier", null)))

Maybe you have to add some type variable hints, such that it compiles. 也许您必须添加一些类型变量提示,以便其进行编译。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM