当某个对象具有装箱类型属性时,该属性的getter返回0。但是这应该返回null,因为boxed类型属性的默认值是null。有什么问题吗?
0
null
class Person { private Long id; public Long getId() { return id; } } ... @Mock Person person; ... person.getId(); // 0 instead of null
eyh26e7m1#
这只是在默认的Mockito应答中为基本类型和 Package 器类型选择的默认值。这个0默认值是在使用null时选择的,当使用null时,由于取消装箱,太多的用户遇到了NPE,特别是对于新手来说,很难诊断。虽然这可能会让习惯引用和取消装箱的人感到惊讶,但这种权衡在可用性方面是值得的。也许有一天,当/如果Java获得了通过反射可访问的空性符号时,这一点可以重新考虑。不管怎样,mockito允许你在不适合项目/团队的情况下改变默认答案。
8ehkhllq2#
我遇到了同样的问题,我的解决方案是将mock的默认答案更改为null:
Person person; ... person = mock(Person.class, new Answer<Object>() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { return null; } }); person.getId(); // null!
(Not如果你想使用@Mock注解,请确定是否可以设置默认答案)如果出于某种原因,你只想为Long设置默认值(而不是Integer),这应该可以在answer方法中实现:
@Mock
Long
Integer
answer
if(invocation.getMethod().getReturnType().equals(Long.class)){ return null; }else{ return Mockito.RETURNS_DEFAULTS.answer(invocation); }
k4emjkb13#
这是getter方法返回的正确值。当你在Mokito中模拟一个类时,类中的所有方法也会被模拟。因此,这与被设置为bottom的boxed type属性无关。正如你看到的,它的LONG值,你有一个示例变量,其默认值是0L。因此person.getId()将始终返回0而不是NULL。
3条答案
按热度按时间eyh26e7m1#
这只是在默认的Mockito应答中为基本类型和 Package 器类型选择的默认值。
这个
0
默认值是在使用null
时选择的,当使用null
时,由于取消装箱,太多的用户遇到了NPE,特别是对于新手来说,很难诊断。虽然这可能会让习惯引用和取消装箱的人感到惊讶,但这种权衡在可用性方面是值得的。也许有一天,当/如果Java获得了通过反射可访问的空性符号时,这一点可以重新考虑。
不管怎样,mockito允许你在不适合项目/团队的情况下改变默认答案。
8ehkhllq2#
我遇到了同样的问题,我的解决方案是将mock的默认答案更改为
null
:(Not如果你想使用
@Mock
注解,请确定是否可以设置默认答案)如果出于某种原因,你只想为
Long
设置默认值(而不是Integer
),这应该可以在answer
方法中实现:k4emjkb13#
这是getter方法返回的正确值。
当你在Mokito中模拟一个类时,类中的所有方法也会被模拟。因此,这与被设置为bottom的boxed type属性无关。正如你看到的,它的LONG值,你有一个示例变量,其默认值是0L。
因此person.getId()将始终返回0而不是NULL。