猿问

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

简介:当从方法调用返回时,我对如何处理单个“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);

    }

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


Foo foo = mock(Foo.class);

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


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

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


assertTrue(The Key == SomeDate)

assertTrue(The Value == True)

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


一只名叫tom的猫
浏览 128回答 3
3回答

吃鸡游戏

无需创建您自己的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);或AbstractMap.SimpleImmutableEntry:Map.Entry<Date, Boolean> entry =  new AbstractMap.SimpleImmutableEntry<>(date, value);作为旁注,来自的日期类java.util已过时,来自的类java.time应用于 Java 8+。具体来说,java.util.Date被替换为java.time.Instant.

繁星coding

构建您自己的自定义 Entry 类需要大量额外的代码实现,仅用于测试。这应该是设计测试的一个危险信号,因为您很可能使问题变得比需要的复杂得多。相反,为什么不创建一个实际的地图并让地图完成工作呢?&nbsp; &nbsp; //define your expected response element&nbsp; &nbsp; Date foo = ...;&nbsp; &nbsp; Boolean bar = ...;&nbsp; &nbsp; //instantiate map&nbsp; &nbsp; Map<Date,Boolean> dummyMap = new HashMap<>();&nbsp; &nbsp; dummyMap.put(foo, bar);&nbsp; &nbsp; //fetch an actual working copy from a functional map&nbsp; &nbsp; Map.Entry<Date, Boolean> baz = dummyMap.entrySet().stream().findFirst().get();&nbsp; &nbsp; //mock away&nbsp; &nbsp; when(foo.getLastModifiedGid(any())).thenReturn(baz);我对您为什么要断言有关条目本身的某些内容感到有些困惑。如果你定义它,它应该是你的。如果您的测试方法更改了它,请测试该结果,而不是您提供的固定对象。

jeck猫

您可以实现自己的条目class DummyEntry<K,V> implements Map.Entry<K, V> {&nbsp; &nbsp; &nbsp; &nbsp; K key;&nbsp; &nbsp; &nbsp; &nbsp; V value;&nbsp; &nbsp; &nbsp; &nbsp; public DummyEntry(K key, V value) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.key = key;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.value = value;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public K getKey() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return key;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public V getValue() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return value;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public V setValue(V value) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.value = value;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return value;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }然后将其返回到您的模拟中。when(foo.getLastModifiedGid(any())).thenReturn(new DummyEntry(...))
随时随地看视频慕课网APP

相关分类

Java
我要回答