为什么Mockito RETURNS_DEFAULT没有返回默认字符串?

时间:2011-12-22 13:16:58

标签: java mockito

在以下示例中(mockito 1.10.19):

    MyClass myClass = Mockito.mock(MyClass .class, RETURNS_DEFAULTS);
    String s = myClass.getName();

为什么这会导致s == null而不是空字符串?

它确实在ReturnsEmptyValues中承诺了null字符串。但是回到""似乎很明显,我想知道是否有理由不这样做。

编辑:将版本从1.8升级到1.10.19,因为1.8不再提供任何文档。

5 个答案:

答案 0 :(得分:11)

从您发布的链接中

  

每个Mockito模拟的默认答案。

     
      
  • 返回原始返回方法的适当原语
  •   
  • 返回原始包装类的一致值(例如int-returns方法返回0和Integer-returning方法返回0,   太)
  •   
  • 返回集合返回方法的空集合(适用于最常用的集合类型)
  •   
  • 返回toString()方法
  • 的mock的描述   
  • 为其他所有内容返回null
  •   

来自常见问题:

默认情况下模拟会返回什么值?

  

为了透明和不引人注目所有Mockito嘲笑   默认返回'nice'值。例如:零,假,空   集合或空值。

可能是为了与任何其他非集合非原始Wrapper对象返回null的方法保持一致。

您始终可以实现自己的Answer传递给mock,它会返回字符串返回方法的空字符串。

答案 1 :(得分:9)

在设计时没有想到,现在出于稳定性原因,这种行为没有改变。

有一个名为ReturnsMoreEmptyValues的非暴露答案,它返回时类型名称表示更多空值。

您还可以查看内部使用ReturnsMoreEmptyValues的Mockito.RETURNS_SMART_NULLS答案,并提供更有趣的调试信息。

请注意此链接指向1.10.19版本的javadoc,但在撰写本文时,此行为在版本2.x中保持不变。

答案 2 :(得分:1)

  1. 因为Mockito的设计师决定将其作为默认使用
  2. 因为null也是Java对象中字段的默认值

答案 3 :(得分:0)

根据所有非集合和非简单类型的Mockito代码,它返回null。 String是Object的子类型,它的“空”值为null,而不是“”.IMHO如果您将字符串的空值表示为null或“”,则这是一个设计决策。

答案 4 :(得分:0)

YourService service = mock(YourService.class, RETURNS_MOCKS);
when(service.callYourFunc()).thenReturn(mockValue);
ReflectionTestUtils.setField(serrviceParent, "service", service);

serrviceParent 是您正在测试的服务,它包含字段 YourService ,该字段无法返回您想要的 mockValue