java使用Mock模拟返回值_mock获取入参数并动态设置返回值

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 16:25   1938   0

/*

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

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

public String answer(InvocationOnMock invocation) throws Throwable {

return invocation.getMethod().getName();

}

})

.thenReturn("Hello")

.thenAnswer(new Answer() {

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

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 {

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

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP