【问题标题】:How to mock a Map returned from a specific method?如何模拟从特定方法返回的地图?
【发布时间】:2021-09-17 22:53:17
【问题描述】:

基本上,我有以下几点:

public class Provider {
  public Map<Enum, Object> get() {
    return Map.of(Enum.ONE, ObjectOne,
                Enum.Two, ObjectTwo);
  }
}

Object value = provider.get().get(Enum.ONE);

我试着嘲笑这个

when(provider.get().get(any())).thenReturn(ObjectOne);

但我收到了这个错误

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
Object cannot be returned by get()
get() should return Map

我不想模拟地图的返回,因为我只希望这个特定方法的地图返回ObjectOne,而不是一般的所有地图。

任何想法我如何模拟provider.get().get(Enum.ONE) 使其返回ObjectOne

Object value = provider.get().get(Enum.ONE);

when(provider.get().get(any())).thenReturn(ObjectOne);

【问题讨论】:

    标签: java mockito


    【解决方案1】:

    感觉你解决问题的方法有误。 ObjectOne 是您似乎想要存根的东西,而不是 Map 本身

    所以,定义一个构造函数

    public class Provider {
    
      private ObjectOne one;
    
      Provider(ObjectOne one) { 
        this.one = one;
      }
    
      public Map<Enum, Object> get() {
        return Map.of(Enum.ONE, one,
                    Enum.Two, ObjectTwo);
      }
    }
    

    并使用一些类似的测试

    ObjectOne oo = new ObjectOne();
    Provider p = new Provider(oo);
    assertSame(oo, p.get().get(Enum.ONE));
    

    否则,您需要存根整个方法

    Map<Enum, Object> map = new HashMap<>();
    map.put(Enum.ONE, "foobar");
    Provider mock = mock(Provider.class);
    when(mock.get()).thenReturn(map);
    
    // obviously the remaining test is pointless because calling mock.get() returns exactly what you already have
    

    【讨论】:

    • 如果这不是您要查找的内容,请使用您的实际代码编辑您的问题
    • 我明白你在这里得到了什么,不幸的是它比我最初希望的要复杂一些。我试图返回ObjectOne 的原因是因为我正在尝试测试后续逻辑。当地图有一堆潜在的返回值时,很难测试这些后续路径。因此,为什么我试图模拟提供者始终返回特定对象。最后,我找到了我的答案here
    【解决方案2】:

    我通过搜索mock nested method calls using mockito找到了答案。

    @Mock
    private ObjectOne mockObjectOne;
    
    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
    private Provider mockProvider;
    
    when(mockProvider.get().get(any())).thenReturn(mockObjectOne);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 2018-12-25
      • 2021-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多