带有类参数与实际对象参数的模拟方法



根据Mockito,这两者之间有什么区别-

Mockito.when(serviceObject.myMethod(Customer.class)).thenThrow(new 运行时异常());

客户

客户 = 新客户(); Mockito.when(serviceObject.myMethod(customer)).thenThrow(new 运行时异常());

如果两者都具有相同的目的,那么使用哪一个被认为是最佳实践?

你这边有一个误解 - 方法规范myMethod(SomeClass.class)只有在该方法的签名允许参数时才可行。喜欢:

Whatever myMethod(Object o) {

或直接

Whatever myMethod(Class<X> clazz) {

换句话说:不是Mockito 对恰好属于类的参数做了一些特别的事情!

因此,您的第一个选择不是"一般"有效的。示例:我在单元测试中放下了这段代码:

static class Inner {
public int foo(String s) { return 5; }
}
@Test
public void testInner() {
Inner mocked = mock(Inner.class);
when(mocked.foo(Object.class)).thenReturn(4);
System.out.println(mocked.foo(""));
}

你猜怎么着 - 以上编译。因为foo()不允许类参数。我们可以重写为

static class Inner {
public int foo(Object o) { return 5; }
}
@Test
public void testInner() {
Inner mocked = mock(Inner.class);
when(mocked.foo(Object.class)).thenReturn(4);
System.out.println(mocked.foo(""));
}

现在上面的编译 - 但在调用时打印 0(零)。因为以上内容与mocked.foo(eq(Object.class))相同.换句话说:当你的方法签名允许传递一个类实例,然后你传递一个类实例时,这就是 mockito 的简单模拟规范。在我的示例中:当传入对象Object.class时 - 将返回 4。但是传入的对象是 " - 因此 Mockito 默认值启动并返回 0。

我在这里使用另一个答案 - 我认为您混淆了旧版本的Mockito 要求您写下when(mocked.foo(any(ExpectedClass.class)))- 现在可以写成when(mocked.foo(any())).但when(mocked.foo(ExpectedClass.class))不是Mockito 构造 - 它是一个简单的方法规范,它给出了一个要"匹配">的特定对象 - 并且该特定对象恰好是类类的实例。

第一个使用泛型Customer类来匹配类型的也可以写成:

Mockito.when(

serviceObject.myMethod(Mockito.any(Customer.class))).thenThrow(new 运行时异常());

如果是第二个,您将传递将在存根中使用的实际对象。

用法:

如果您的方法myMethod基于Customer对象的状态引发异常,则可以使用后一种方法,您可以在其中适当地设置 Customer 对象的状态。

但是,如果您的方法myMethod不依赖于Customer对象来引发异常,而只需要它作为参数传递以调用该方法,那么您可以采用前一种方法。

相关内容

  • 没有找到相关文章

最新更新