我正在使用Mockito 1.9.5。我有以下代码:
public class ClassA {
public List<? extends MyInterface> getMyInterfaces() {
return null;
}
public static void testMock() {
List<MyInterface> interfaces = new ArrayList<>();
ClassA classAMock = mock(ClassA.class);
when(classAMock.getMyInterfaces()).thenReturn(interfaces);
}
我收到一句编译错误thenReturn(interfaces)
:
"The method thenReturn(List<capture#1-of ? extends MyInterface>) in the type
OngoingStubbing<List<capture#1-of ? extends MyInterface>> is not applicable for the arguments
(List<MyInterface>)"
但是,当我使用thenAnswer
模拟方法时,不会出现错误。谁能告诉我怎么回事?使用该thenReturn
方法时为什么会出现错误?当ClassA
第三方提供且无法修改时,还有其他方法可以解决此问题吗?
编辑 :从Mockito 1.10.x开始,嵌入在类中的泛型类型现在由Mockito用于深层存根。即。
public interface A<T extends Observer & Comparable<? super T>> {
List<? extends B> bList();
T observer();
}
B b = deep_stubbed.bList().iterator().next(); // returns a mock of B ; mockito remebers that A returns a List of B
Observer o = deep_stubbed.observer(); // mockito can find that T super type is Observer
Comparable<? super T> c = deep_stubbed.observer(); // or that T implements Comparable
Mockito尽最大努力获取编译器嵌入的类型信息,但是当应用擦除时,mockito除了返回的模拟外,什么也不能做Object
。
原文 :恩,泛型比Mockito的问题更多。对于泛型,您应该阅读 Angelika Langer
在其上写的内容。对于当前主题(即通配符),请阅读本节。
但简而言之,您可以使用Mockito的另一种语法来帮助您解决当前情况:
doReturn(interfaces).when(classAMock).getMyInterfaces();
或使用BDD别名:
willReturn(interfaces).given(classAMock).getMyInterfaces();
不过,您可以编写更加通用的包装器。这将有助于将来的开发人员使用相同的第三方API。
附带说明:您不应该模拟自己不拥有的类型,它会导致许多错误和问题。相反,您应该有一些包装。例如,DAO和存储库就代表了这样的想法,它将模拟DAO或存储库接口,而不是JDBC
/ JPA / hibernate。有许多关于此的博客文章:
我正试图模拟一个泛型方法,但无论我做什么尝试,都会得到类转换异常。正在测试的类是 而测试类是 其他帮助器类和接口有: 此外,出现此错误的原因可能是:1。您使用final/private/equals()/hashCode()方法中的任一个作为存根。这些方法不能被截取/验证。不支持在非公共父类上声明的模拟方法。2.内部when()不是对mock而是对其他对象调用method。
我有一个带有泛型参数的抽象测试类。 我已经实现了它的一个具体测试类。 方法签名如下所示 当运行时,我得到一个说 为什么?我有什么办法可以解决这个问题吗?
有一个方法
我试图用Mockito 1.9.5模拟一个类,但是我很难让它工作。 我写了我的测试样板: ...并得到一个长的< code>ClassCastException: 线程“main”java.lang.ClassCastException中的异常:org.mockito.internal.creation.jmock.ClassImposterizer$ClassWithSuperclassToWo
我遇到了Mockito的一个bug,但我想知道是否有其他人可以解释为什么这个测试不起作用。 基本上,我有两个对象,如下所示: 第一个对象是通过注释和之前的方法模拟的: 在方法中模拟第二个对象: 当包含对此方法的直接调用以设置并获取第二个对象的模拟时,它将失败: 但是,当同一方法返回的模拟被分配给一个局部变量(在中使用)时,它可以工作: 我们是否做错了什么,或者这确实是Mockito中的一个缺陷/限
使用mockito模拟一个方法会确保永远不会调用被模拟的方法吗?我有一个主类,它包含一些我想为其编写单元测试的代码,还有一个单元测试类MainTest,它包含主类的单元测试。 eg: 源类: JUnit测试(使用mockito) 这项测试失败了。为什么?