Java 模拟方法不';t返回预期结果
我想模拟接受对象参数的方法Java 模拟方法不';t返回预期结果,java,unit-testing,mocking,mockito,Java,Unit Testing,Mocking,Mockito,我想模拟接受对象参数的方法mockedMethod(objectobjectobject)。此对象参数是根据testedMethod动态创建的mockedMethod不会返回预期结果,尽管两个对象具有相同的数据,但只有不同的hashCode 下面是一个例子 public void testedMethod() { Object object = initObject(); // this object is initialized dynamically Long result
mockedMethod(objectobjectobject)
。此对象参数是根据testedMethod
动态创建的mockedMethod
不会返回预期结果,尽管两个对象具有相同的数据,但只有不同的hashCode
下面是一个例子
public void testedMethod() {
Object object = initObject(); // this object is initialized dynamically
Long result = mockedMethod(object);
...
}
@Test
public void test() {
Object object = new Object();
when(api.mockedMethod(object).thenReturn(3L);
testedMethod();
}
有没有办法模仿这个方法,让它以预期的结果响应 当然不是“预期的”;您将一个完全不同的对象传递到
when
子句中,该方法使用自己的frominitObject()
。您应该将对象
注入到被测试的类中,或者mockedMethod
属于服务接口,并且您应该对其进行模拟。当然它不是“预期的”;您将一个完全不同的对象传递到when
子句中,该方法使用自己的frominitObject()
。您应该将对象
注入到被测试的类中,或者mockedMethod
属于服务接口,并且您应该对其进行模拟。当然它不是“预期的”;您将一个完全不同的对象传递到when
子句中,该方法使用自己的frominitObject()
。您应该将对象
注入到被测试的类中,或者mockedMethod
属于服务接口,并且您应该对其进行模拟。当然它不是“预期的”;您将一个完全不同的对象传递到when
子句中,该方法使用自己的frominitObject()
。您应该将对象
注入到被测试的类中,或者mockedMethod
属于服务接口,并且您应该对其进行模拟。这里似乎有两个选项:
接受任何东西
您可以使用注释中提到的any()
或notNull()
。它们定义了任何参数(any
)或任何非空参数(notNull
)的行为
这些静态方法返回,可以在继承自的上找到(以保持API稍微分开)
编写自己的自定义匹配器
如果需要检查对象是否符合某些自定义条件,可以使用自定义ArgumentMatcher对象。这些对象(也称为Hamcrest匹配器,因为它们直接来自Hamcrest库)只有一个布尔方法,如果对象匹配条件,则返回true
/** Returns true if the passed object has FooBar anywhere in its class name. */
class HasFooBarInClassName extends ArgumentMatcher<Object> {
@Override public boolean matches(Object object) {
return object.getClass().getName().contains("FooBar");
}
}
when(api.mockedMethod(argThat(new HasFooBarInClassName())).thenReturn(3L);
看起来你有两个选择: 接受任何东西 您可以使用注释中提到的
any()
或notNull()
。它们定义了任何参数(any
)或任何非空参数(notNull
)的行为
这些静态方法返回,可以在继承自的上找到(以保持API稍微分开)
编写自己的自定义匹配器
如果需要检查对象是否符合某些自定义条件,可以使用自定义ArgumentMatcher对象。这些对象(也称为Hamcrest匹配器,因为它们直接来自Hamcrest库)只有一个布尔方法,如果对象匹配条件,则返回true
/** Returns true if the passed object has FooBar anywhere in its class name. */
class HasFooBarInClassName extends ArgumentMatcher<Object> {
@Override public boolean matches(Object object) {
return object.getClass().getName().contains("FooBar");
}
}
when(api.mockedMethod(argThat(new HasFooBarInClassName())).thenReturn(3L);
看起来你有两个选择: 接受任何东西 您可以使用注释中提到的
any()
或notNull()
。它们定义了任何参数(any
)或任何非空参数(notNull
)的行为
这些静态方法返回,可以在继承自的上找到(以保持API稍微分开)
编写自己的自定义匹配器
如果需要检查对象是否符合某些自定义条件,可以使用自定义ArgumentMatcher对象。这些对象(也称为Hamcrest匹配器,因为它们直接来自Hamcrest库)只有一个布尔方法,如果对象匹配条件,则返回true
/** Returns true if the passed object has FooBar anywhere in its class name. */
class HasFooBarInClassName extends ArgumentMatcher<Object> {
@Override public boolean matches(Object object) {
return object.getClass().getName().contains("FooBar");
}
}
when(api.mockedMethod(argThat(new HasFooBarInClassName())).thenReturn(3L);
看起来你有两个选择: 接受任何东西 您可以使用注释中提到的
any()
或notNull()
。它们定义了任何参数(any
)或任何非空参数(notNull
)的行为
这些静态方法返回,可以在继承自的上找到(以保持API稍微分开)
编写自己的自定义匹配器
如果需要检查对象是否符合某些自定义条件,可以使用自定义ArgumentMatcher对象。这些对象(也称为Hamcrest匹配器,因为它们直接来自Hamcrest库)只有一个布尔方法,如果对象匹配条件,则返回true
/** Returns true if the passed object has FooBar anywhere in its class name. */
class HasFooBarInClassName extends ArgumentMatcher<Object> {
@Override public boolean matches(Object object) {
return object.getClass().getName().contains("FooBar");
}
}
when(api.mockedMethod(argThat(new HasFooBarInClassName())).thenReturn(3L);
好的,我知道你建议的解决方案。但它迫使我改变API。因此,我正在寻找其他解决方法。好的,我知道你建议的解决方法。但它迫使我改变API。因此,我正在寻找其他解决方法。好的,我知道你建议的解决方法。但它迫使我改变API。因此,我正在寻找其他解决方法。好的,我知道你建议的解决方法。但它迫使我改变API。因此,我正在寻找其他方法来解决它。您是否真的关心作为参数传递的对象是什么,或者它可能是什么?然后您可以尝试
when(api.mockedMethod(notNull())。然后返回(3L)
。让我知道这是否是您真正想要的,这样我就可以添加它作为答案,如果您真的关心作为参数传递的对象是什么,或者它可能是什么?然后您可以在(api.mockedMethod(notNull())时尝试。然后返回(3L)
。让我知道这是否是您真正想要的,这样我就可以添加它作为答案,如果您真的关心作为参数传递的对象是什么,或者它可能是什么?然后您可以在(api.mockedMethod(notNull())时尝试。然后返回(3L)
。如果需要,请告诉我