从方法调用返回时模拟和处理 Map.Entry

jb6*_*b62 2 java collections unit-testing

摘要:我对从方法调用返回时如何处理单个“Map.Entry”感到困惑。在我的具体情况下,我需要模拟这个(目前使用mockito),但我的问题是如何将“Map.Entry”作为一个单元处理,而不是模拟它......两者的帮助将是巨大的赞赏。

===========================

我有一个像下面这样的方法。我需要创建一个匹配的实体(我假设是一个 Map.Entry),以便在调用该方法时返回模拟。我不知道如何创建单个 Map.Entry。我已经跟踪调用一直追溯到对数据库的 sql 调用,但只能找到将返回的对象转换为 Map.Entry 的点。

没有说明如何构建这样的东西。我需要有关如何构建可由模拟返回的单个“Map.Entry”的帮助。

 public Map.Entry<Date,Boolean> getLastModified(SomeClass someClass)
    throws Exception
    {
        return clusterViewDataProvider.getClusterModified(someClass);
    }
Run Code Online (Sandbox Code Playgroud)

这是一行将为我创建模拟对象的行。为了简单起见,假设上面的方法位于“Foo”类中。

Foo foo = mock(Foo.class);
Run Code Online (Sandbox Code Playgroud)

然后我需要这样的东西来说明当调用该方法(作为模拟)时,它应该返回我需要构建的“Map.Entry”。

when(foo.getLastModifiedGid(any())).thenReturn(the Map.Entry I don't know how to make yet);
Run Code Online (Sandbox Code Playgroud)

最后,我需要断言返回的 Map.Entry 的一些可测试内容。我可以检查断言中的键和值 - 没有比这更奇特的了 - 再次,我不确定如何将其作为单个 Map.Entry 访问...

assertTrue(The Key == SomeDate)
assertTrue(The Value == True)
Run Code Online (Sandbox Code Playgroud)

如果我有任何不清楚的地方,请发表评论,我会澄清。谢谢。

mic*_*alk 5

无需创建您自己的Map.Entry实现。您可以使用现有的实现之一,例如AbstractMap.SimpleEntry

Date date = new Date();
boolean value = true;

Map.Entry<Date, Boolean> entry =  new AbstractMap.SimpleEntry<>(date, value);
when(foo.getLastModifiedGid(any())).thenReturn(entry);
Run Code Online (Sandbox Code Playgroud)

或者AbstractMap.SimpleImmutableEntry

Map.Entry<Date, Boolean> entry =  new AbstractMap.SimpleImmutableEntry<>(date, value);
Run Code Online (Sandbox Code Playgroud)

附带说明一下,日期类 fromjava.util已经过时,而类 fromjava.time应该用于 Java 8+。具体来说,java.util.Date被替换为java.time.Instant.