当前位置: 首页 > 知识库问答 >
问题:

如何模拟从特定方法返回的Map?

厉文栋
2023-03-14

基本上,我有以下几点:

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,而不是所有的映射。

你知道我是如何模仿提供者的吗。get()。获取(Enum.ONE)以便它返回ObjectOne

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

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

共有2个答案

于捷
2023-03-14

我通过使用mockito搜索模拟嵌套方法调用找到了答案。

@Mock
private ObjectOne mockObjectOne;

@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Provider mockProvider;

when(mockProvider.get().get(any())).thenReturn(mockObjectOne);
周楷
2023-03-14

感觉你处理问题的方式不对。ObjectOne是您似乎想要存根的对象,而不是映射本身

定义一个构造函数

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
 类似资料:
  • 如何模拟返回已强制转换的模拟对象的方法。 试验方法。

  • 问题内容: 我正在为我的应用程序编写单元测试,我想知道Mockito框架是否有可能影响传递到返回无效类的方法中的对象。例如,调用一个包含方法的模拟验证类,该方法返回void,但通过作为参数传入的对象来跟踪各种更改和元数据。。 我为其他测试模拟了验证器类,但是对于这个测试,我需要模拟对不知道怎么做的cartItemsFilter对象的更改。 问题答案: 答案是肯定的,您可以,并且根据测试的需要,基本

  • 问题内容: 我想模拟下一行: 这里的问题是newBigQueryClient方法返回的Bulder类是最终的。这意味着我既不能使用嘲讽也不可以使用powermockito来模拟它(它返回这样的异常:不能对最终类进行子类化),但是我需要返回适合于模拟它的构建方法的东西。有什么想法怎么做? 问题答案: 改善代码并使其更具可测试性的建议: 首先,您不会像您给我们的示例那样模拟 声明 。您可以模拟 对象

  • 问题内容: 我使用PowerMock 1.4.7和JUnit 4.8.2 我只需要模拟一些静态方法,而我想让其他方法(来自同一类)只是返回原始值。当我嘲笑并且不调用所有静态方法时,它们会返回其默认值- 例如,返回Object时为null或返回布尔值时为false …等等。因此,我尝试在每个静态方法上显式使用它 来返回默认实现(意味着没有模拟/没有伪造),但是我不知道如何在每个可能的参数变体上调用它

  • 我有一个类,它有以下实现: 如您所见,方法调用,然后在返回结果之前执行一些逻辑。 当我试图模拟这个存储库进行单元测试时,我很难从中获得结果,因为它总是作为空引用异常而失败。 以下是单元测试: 如何使此测试工作,使模拟方法在调用被模拟的方法之后执行一些逻辑?

  • 我对Mockito很陌生。我想为下面的方法编写一个mock。我该怎么写?我的模拟方法会是什么样子?