mock获取入参数并动态设置返回值

/*
  * Copyright (c) 2007 Mockito contributors
  * This program is made available under the terms of the MIT License.
  */
 package org.mockitousage.stubbing;
  
 import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 import org.mockitousage.IMethods;
 import org.mockitoutil.TestBase;
  
 import java.lang.reflect.Method;
 import java.util.Set;
  
 import static org.junit.Assert.*;
 import static org.mockito.Mockito.*;
  
 public class StubbingWithCustomAnswerTest extends TestBase {
 @Mock
 private IMethods mock;
  
 @Test
 public void shouldAnswer() throws Exception {
 when(mock.simpleMethod(anyString())).thenAnswer(new Answer<String>() {
 public String answer(InvocationOnMock invocation) throws Throwable {
 String arg = invocation.getArgument(0);
  
 return invocation.getMethod().getName() + "-" + arg;
 }
 });
  
 assertEquals("simpleMethod-test", mock.simpleMethod("test"));
 }
  
 @Test
 public void shouldAnswerWithThenAnswerAlias() throws Exception {
 RecordCall recordCall = new RecordCall();
 Set<?> mockedSet = (Set<?>) when(mock(Set.class).isEmpty()).then(recordCall).getMock();
  
 mockedSet.isEmpty();
  
 assertTrue(recordCall.isCalled());
 }
  
 @Test
 public void shouldAnswerConsecutively() throws Exception {
 when(mock.simpleMethod())
 .thenAnswer(new Answer<String>() {
 public String answer(InvocationOnMock invocation) throws Throwable {
 return invocation.getMethod().getName();
 }
 })
 .thenReturn("Hello")
 .thenAnswer(new Answer<String>() {
 public String answer(InvocationOnMock invocation) throws Throwable {
 return invocation.getMethod().getName() + "-1";
 }
 });
  
 assertEquals("simpleMethod", mock.simpleMethod());
 assertEquals("Hello", mock.simpleMethod());
 assertEquals("simpleMethod-1", mock.simpleMethod());
 assertEquals("simpleMethod-1", mock.simpleMethod());
 }
  
 @Test
 public void shouldAnswerVoidMethod() throws Exception {
 RecordCall recordCall = new RecordCall();
  
 doAnswer(recordCall).when(mock).voidMethod();
  
 mock.voidMethod();
 assertTrue(recordCall.isCalled());
 }
  
 @Test
 public void shouldAnswerVoidMethodConsecutively() throws Exception {
 RecordCall call1 = new RecordCall();
 RecordCall call2 = new RecordCall();
  
 doAnswer(call1)
 .doThrow(new UnsupportedOperationException())
 .doAnswer(call2)
 .when(mock).voidMethod();
  
 mock.voidMethod();
 assertTrue(call1.isCalled());
 assertFalse(call2.isCalled());
  
 try {
 mock.voidMethod();
 fail();
 } catch (UnsupportedOperationException e) {
 }
  
 mock.voidMethod();
 assertTrue(call2.isCalled());
 }
  
 @Test
 public void shouldMakeSureTheInterfaceDoesNotChange() throws Exception {
 when(mock.simpleMethod(anyString())).thenAnswer(new Answer<String>() {
 public String answer(InvocationOnMock invocation) throws Throwable {
 assertTrue(invocation.getArguments().getClass().isArray());
 assertEquals(Method.class, invocation.getMethod().getClass());
  
 return "assertions passed";
 }
 });
  
 assertEquals("assertions passed", mock.simpleMethod("test"));
 }
  
 private static class RecordCall implements Answer<Object> {
 private boolean called = false;
  
 public boolean isCalled() {
 return called;
 }
  
 public Object answer(InvocationOnMock invocation) throws Throwable {
 called = true;
 return null;
 }
 }
  
 }

2.    当mock一个对象,且执行此对象中的方法没有返回值时,使用下面的方法:

import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;

类名   对象 = Mockito.mock(类名.class);
        Mockito.doAnswer(new Answer<Object>() {
            public Object answer(InvocationOnMock invocation) {
                Object[] args = invocation.getArguments();
                return "called with arguments: " + args;
            }
        }).when(对象).方法名();

 

--------------------- 本文来自 flysun3344 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/flysun3344/article/details/52065492?utm_source=copy 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值