Java 当使用实对象返回null调用时,必须使用any()

Java 当使用实对象返回null调用时,必须使用any(),java,testing,mockito,Java,Testing,Mockito,当我使用mock@Service进行单元测试时,我注意到在Mockito.When()语句中,当我保存真实对象时,我得到null作为返回;我必须使用any() 因此,与其使用: @Mock private BinInfoService service; ... @Test public void testSave() { SomeBean bean = new SomeBean(); Mockito.when(service.saveBinInfo(bean).thenRet

当我使用mock
@Service
进行单元测试时,我注意到在
Mockito.When()
语句中,当我保存真实对象时,我得到
null
作为返回;我必须使用
any()

因此,与其使用:

@Mock
private BinInfoService service;
...  
@Test
public void testSave() {
    SomeBean bean = new SomeBean();
    Mockito.when(service.saveBinInfo(bean).thenReturn(bean);
}
我必须使用:

Mockito.when(service.saveBinInfo(Mockito.any(SomeBean.class))).thenReturn(bean);
第一个表单返回
null
。而第二个表单返回保存的实体

为什么?

编辑:

对不起,实际上我没有像上面那样实例化对象。我用了另外两种方法。查看我的答案。

来自

“Mockito以自然java风格验证参数值:使用equals()方法”

很可能您的bean没有实现equals方法,因此它返回null,因为默认实现下一个新bean与另一个bean不相等。 另一方面,matcher允许该类的任何bean,因此它总是返回值。

From

“Mockito以自然java风格验证参数值:使用equals()方法”

很可能您的bean没有实现equals方法,因此它返回null,因为默认实现下一个新bean与另一个bean不相等。
另一方面,matcher允许该类的任何bean,因此它总是返回值。

毕竟我刚刚找到了原因。对这个问题的描述有误导性,所以我必须注意

有两种情况

  • 在一种方法中,我使用模拟的Rest调用保存实体,将实体作为序列化json作为参数传入。我猜,当这样做时,上下文每次都会创建新对象,并且内存地址是不同的

  • 在另一种方法中,我保存一个声明为私有字段的实体,实例化代码方法在之前用
    @注释。因此,在每次测试之前,它将被创建一次,因此内存地址也是不同的


  • 毕竟我只是找到了原因。对这个问题的描述有误导性,所以我必须注意

    有两种情况

  • 在一种方法中,我使用模拟的Rest调用保存实体,将实体作为序列化json作为参数传入。我猜,当这样做时,上下文每次都会创建新对象,并且内存地址是不同的

  • 在另一种方法中,我保存一个声明为私有字段的实体,实例化代码方法在之前用
    @注释。因此,在每次测试之前,它将被创建一次,因此内存地址也是不同的


  • 不能肯定。当我添加
    equals()
    hashCode()
    方法时,它仍然无法通过。您在实现该方法时是否检查了SomeBean的两个新实例是否相等?是的;断言的该部分通过。无法确认。当我添加
    equals()
    hashCode()
    方法时,它仍然无法通过。您在实现该方法时是否检查了SomeBean的两个新实例是否相等?是的;断言的这一部分通过了。通常,“OP”指的是原始海报,而不是问题。你误导的说法看起来很奇怪,我可以建议将“问题”改为“我原以为是原创帖子。哈哈。通常,“OP”指的是原创海报而不是问题。你误导的说法看起来很奇怪,我可以建议将“问题”改为“我原以为是原创帖子”。哈哈。