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

我正在尝试模拟一个通用方法,但无论我尝试什么,都会得到类转换异常。正在测试的类是


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() 中,您不会在模拟上调用方法,而是在其他对象上调用方法。


汪汪一只猫
浏览 299回答 2
2回答

守着一只汪

您的类型不兼容,这与 mockito 无关。asObject()返回与它接收到的SInterface类型相同的类型,并且它必须是类型。根据您尝试实现的目标,您可以返回以下实例SSClasss:Mockito.when(tClass.asObject(new&nbsp;SSClass())).thenReturn(&nbsp;new&nbsp;SSClass());或者你可以TClass扩展SInterface然后:Mockito.when(tClass.asObject(tClass)).thenReturn(tClass);

慕后森

我认为你想测试 TClass.asObject() 但验证 sClass.SMethod() 被调用。@org.junit.Testpublic void asObject() {&nbsp; &nbsp; &nbsp; &nbsp; final SSInterface sut = new SSClass();&nbsp; &nbsp; &nbsp; &nbsp; final SSInterface returned = sut.asObject(sClass);&nbsp; &nbsp; &nbsp; &nbsp; assertEquals(sClass, returned);&nbsp; &nbsp; &nbsp; &nbsp; Mockito.verify(sClass).SMethod(any());&nbsp; &nbsp;&nbsp;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java