为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 mockito 模拟泛型方法?

如何使用 mockito 模拟泛型方法?

汪汪一只猫 2022-01-06 17:00:58
我正在尝试模拟一个通用方法,但无论我尝试什么,都会得到类转换异常。正在测试的类是public class TClass {    private byte[] data;    public <T extends SInterface> T asObject(T item){        item.SMethod(this.getData());        return item;    }    private byte[] getData() {        return data;    }}而测试类是@RunWith(MockitoJUnitRunner.class)public class TClassTest {    @Mock    SSInterface sClass;    @Mock    SObject sObject;    TClass tClass = new TClass();    @org.junit.Before    public void setUp() throws Exception {    }    @org.junit.Test    public void asObject() {        Mockito.when(tClass.asObject(new SSClass())).thenReturn(sClass);    }}其他帮助类和接口是: public interface SInterface {    public void SMethod(byte[] in);}public interface SSInterface extends SInterface {}public class SSClass implements SSInterface {    @Override    public void SMethod(byte[] in) {    }}public class SObject {}我得到的错误是:无法解析方法 thenReturn(generic.SSInterface)如果我使用 Mockito.when(tClass.asObject(new SSClass())).thenReturn(new SSClass());我得到 org.mockito.exceptions.misusing.MissingMethodInvocationException: when() 需要一个必须是“模拟方法调用”的参数。例如:when(mock.getArticles()).thenReturn(articles);此外,出现此错误的原因可能是: 1. 您存根了以下任一方法: final/private/equals()/hashCode() 方法。这些方法不能被存根/验证。不支持在非公共父类上声明的模拟方法。2. 在 when() 中,您不会在模拟上调用方法,而是在其他对象上调用方法。
查看完整描述

2 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

您的类型不兼容,这与 mockito 无关。asObject()返回与它接收到的SInterface类型相同的类型,并且它必须是类型。

根据您尝试实现的目标,您可以返回以下实例SSClasss

Mockito.when(tClass.asObject(new SSClass())).thenReturn( new SSClass());

或者你可以TClass扩展SInterface然后:

Mockito.when(tClass.asObject(tClass)).thenReturn(tClass);


查看完整回答
反对 回复 2022-01-06
?
慕后森

TA贡献1802条经验 获得超5个赞

我认为你想测试 TClass.asObject() 但验证 sClass.SMethod() 被调用。


@org.junit.Test

public void asObject() {

        final SSInterface sut = new SSClass();


        final SSInterface returned = sut.asObject(sClass);


        assertEquals(sClass, returned);

        Mockito.verify(sClass).SMethod(any());    

}


查看完整回答
反对 回复 2022-01-06
  • 2 回答
  • 0 关注
  • 298 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信