【JAVA-UT】18、when--指定mock对象的返回值

12 篇文章 0 订阅
12 篇文章 0 订阅

文|码术张

在这里插入图片描述

真实对象有自己的行为;mock对象没有。

于是拿到输入后,真实对象有输出,mock对象没有输出。

为了让mock对象模拟真实对象,就要给mock对象一个输出。

在Mockito中,如何给mock对象一个输出呢?

这就要用到when语句。

when语句常用的4种类型,一一介绍如下。

1 when(mockObject.methodA(input1)).thenReturn(output1)

意思是当mock对象的方法A遇到输入input1时,输出将是output1。

假如NameLoader有一个方法download:

public String download(String addr)

输入是一个server地址,输出是从server上取得的数据。

在ut中,首先生成一个mock对象:

nameLoader = mock(NameLoader.class);

nameLoader是NameLoader的mock对象。

然后,设置输出。

假设当输入为"http://10.0.1.1"时,让输出为“abc”,相应的when语句如下:

when(nameLoader.download("http://10.0.0.1")).thenReturn(“abc”);

也可以使用matchers作为参数:

when(nameLoader.download(anyString())).thenReturn(“abc”);

2 when(mockObject.methodA(input1)).thenReturn(output1).thenReturn(output2)

意思是mock对象的某一方法第一次调用时,返回值为output1;第二次及更多次调用时,返回值为output2。

下面是工作中的一个例子。

console两次读入input后,不论input是什么,第一次返回"abc",第二次返回"all"。

在这里插入图片描述

3.when(mockObject.methodA(input1)).thenThrow(output1)

当调用mock对象的方法A时,抛出一个异常。

when(mock.someMethod(“some arg”)).thenThrow(new RuntimeException());

4 doRetrun(output).when(mockObject).methodA(input)

意思是当调用mock对象的方法A时,返回output。

在以下两种情形下,这种方式与方式1是不同的。

<1>When spying real objects and calling real methods on a spy brings side effects

KeystoreVisitor spyKeyStoreVisitor = spy(keystoreVisitor);

错误的设置返回值的方法,这时会真的去执行readKeystore,而不是返回keystore。

when(spyKeyStoreVisitor.readKeystore(any())).thenReturn(keystore);

正确的方法如下:

doReturn(keystore).when(spyKeyStoreVisitor).readKeystore(any());

这时不会调用真实的方法。

<2>Overriding a previous exception-stubbing:

when(mock.foo()).thenThrow(new RuntimeException());

//Impossible: the exception-stubbed foo() method is called so RuntimeException is //thrown.
when(mock.foo()).thenReturn("bar");

//You have to use doReturn() for stubbing:
doReturn("bar").when(mock).foo();

https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#when-T-

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaMock测试中,要获取无返回值方法内部定义的变量或对象,可以通过模拟方法的行为来实现。Mock测试通常使用Mock框架,如Mockito,来实现对方法的模拟。下面是一些可能有用的方法和技巧: 1. 使用Mockito的doAnswer方法:该方法可以模拟方法的行为,并使用Lambda表达式来获取方法内部定义的变量或对象。例如: ``` @Test public void testMethod() { MyClass myClass = mock(MyClass.class); doAnswer(invocation -> { Object[] args = invocation.getArguments(); // 在这里可以获取方法内部定义的变量或对象 return null; }).when(myClass).myVoidMethod(); myClass.myVoidMethod(); } ``` 2. 使用Mockito的ArgumentCaptor:该类可以用于捕获方法调用时的参数,并在测试中进行断言。例如: ``` @Test public void testMethod() { MyClass myClass = mock(MyClass.class); ArgumentCaptor<MyObject> captor = ArgumentCaptor.forClass(MyObject.class); doNothing().when(myClass).myVoidMethod(captor.capture()); MyObject obj = new MyObject(); myClass.myVoidMethod(obj); // 在这里可以获取方法内部定义的变量或对象 assertEquals(obj, captor.getValue()); } ``` 需要注意的是,在Mock测试中获取方法内部定义的变量或对象可能会破坏测试的封装性。如果变量或对象不是方法的输出,而只是中间过程的一部分,最好不要直接获取它们,而是通过Mock对象来模拟它们的行为。这样可以更好地保持测试的独立性和可重复性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值