根据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
类来匹配类型的也可以写成:
serviceObject.myMethod(Mockito.any(Customer.class))).thenThrow(new 运行时异常());
如果是第二个,您将传递将在存根中使用的实际对象。
用法:
如果您的方法myMethod
基于Customer
对象的状态引发异常,则可以使用后一种方法,您可以在其中适当地设置 Customer 对象的状态。
但是,如果您的方法myMethod
不依赖于Customer
对象来引发异常,而只需要它作为参数传递以调用该方法,那么您可以采用前一种方法。