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() {
            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 

你可能感兴趣的:(mock获取入参数并动态设置返回值)