mockito 外部接口_java-与Mockito的接口的模拟getter / setter方法

本文探讨了在使用JUnit和Mockito测试时遇到的问题,具体是关于如何模拟接口的getter和setter方法。示例中,KeyValueInterface接口和其实现类KeyValueImpl被用于演示。ValueFinder类依赖于这个接口,而测试类ValueFinderTest尝试通过Mockito对接口进行模拟,但在某些测试用例中遇到了AssertionError或MockitoException。作者寻求解决方案,希望能解决在必须模拟接口而非类的情况下,如何正确调用接口方法的问题。
摘要由CSDN通过智能技术生成

我试图用jUnit和Mockito测试我的实现,但是遇到了问题.这是一个非常简单的示例,解释了该问题

接口KeyValueInterface

public interface KeyValueInterface {

public abstract String getKey();

public abstract void setKey(String key);

public abstract String getValue();

public abstract void setValue(String value);

}

类KeyValueImpl

public class KeyValueImpl implements KeyValueInterface {

private String key;

private String value;

@Override

public String getKey() {

return key;

}

@Override

public void setKey(String key) {

this.key = key;

}

@Override

public String getValue() {

return value;

}

@Override

public void setValue(String value) {

this.value = value;

}

}

具有“业务逻辑”的类

public class ValueFinder {

public KeyValueInterface findValueForKey(KeyValueInterface keyValue){

keyValue.setValue("foo");

return keyValue;

}

}

jUnit测试类

import static org.junit.Assert.*;

import org.junit.Test;

import org.mockito.Mockito;

public class ValueFinderTest {

@Test

public void testNotMocked() {

KeyValueInterface keyValue = new KeyValueImpl();

keyValue = (new ValueFinder()).findValueForKey(keyValue);

assertEquals("foo", keyValue.getValue()); // works fine

}

@Test

public void testMocked1() {

KeyValueInterface keyValue = Mockito.mock(KeyValueInterface.class);

keyValue = (new ValueFinder()).findValueForKey(keyValue);

assertEquals("foo", keyValue.getValue()); // java.lang.AssertionError:

// expected: but

// was:

}

@Test

public void testMocked2() {

KeyValueInterface keyValue = Mockito.mock(KeyValueInterface.class);

keyValue = (new ValueFinder()).findValueForKey(keyValue);

Mockito.when(keyValue.getValue()).thenCallRealMethod();

Mockito.doCallRealMethod().when(keyValue).setValue(Mockito.any(String.class));

assertEquals("foo", keyValue.getValue()); // org.mockito.exceptions.base.MockitoException:

// Cannot call real method

// on java interface.

// Interface does not have

// any implementation!

// Calling real methods is

// only possible when

// mocking concrete classes.

}

}

我的探究是,出于技术原因,我需要模拟KeyValue,这超出了我的控制范围.因此,我不能只使用方法testNotMocked().同样由于技术原因,我不得不控制接口(而不是类).

有什么办法可以做到这一点?

非常感谢.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值