我正在尝试模拟一个通用方法,但无论我尝试什么,都会得到类转换异常。正在测试的类是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);
慕后森
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());
}
添加回答
举报
0/150
提交
取消