错误详细信息:
org.mockito.exceptions.misusing.WrongTypeOfReturnValue:
Boolean cannot be returned by updateItemAttributesByJuId()
updateItemAttributesByJuId() should return ResultRich
This exception might occur in wrongly written multi-threaded tests.
Please refer to Mockito FAQ on limitations of concurrency testing.
我的代码 :
@InjectMocks
protected ItemArrangeManager arrangeManagerSpy = spy(new ItemArrangeManagerImpl());
@Mock
protected JuItemWriteService juItemWriteService;
when(arrangeManagerSpy
.updateItemAttributes(mapCaptor.capture(), eq(juId), eq(itemTO.getSellerId())))
.thenReturn(false);
如您所见,我在updateItemAttributes
上调用when
(它确实返回boolean
)而不是在updateItemAttributesByJuId
上。
- 为什么莫西托试图从
updateItemAttributesByJuId
返回boolean
? - 如何纠正这种情况?
https://groups.google.com/forum/?fromgroups#!topic/mockito/9WUvkhZUy90,你应该改写你的
when(bar.getFoo()).thenReturn(fooBar)
自
doReturn(fooBar).when(bar).getFoo()
类似错误消息的另一个原因是试图模拟final
方法。人们不应该试图模拟最终方法(请参阅最终方法模拟)。
我也在多线程测试中遇到了错误。在这种情况下,GNA的回答有效。
非常感兴趣的问题。就我而言,当我尝试在类似的行上调试测试时,会导致此问题:
Boolean fooBar;
when(bar.getFoo()).thenReturn(fooBar);
重要的注意事项是,测试在没有调试的情况下正常运行。
无论如何,当我用下面的代码片段替换上面的代码时,我能够毫无问题地调试问题行。
doReturn(fooBar).when(bar).getFoo();
对我来说,这意味着我正在运行这个:
a = Mockito.mock(SomeClass.class);
b = new RealClass();
when(b.method1(a)).thenReturn(c);
// within this method1, it calls param1.method2() -- note, b is not a spy or mock
所以发生的事情是,mockito检测到a.method2()
被召唤了,并告诉我我无法从a.method2()
中返回c
这是错误的。
修复:使用 doReturn(c).when(b).method1(a)
样式语法(而不是 when(b.method1(a)).thenReturn(c);
),这将帮助您更简洁、更快速地发现隐藏的错误。
或者在这种特殊情况下,在这样做之后,它开始显示更准确的"NotAMockException",我将其更改为不再尝试从非模拟对象设置返回值。
我最近遇到了这个问题。问题是我试图模拟的方法没有访问修饰符。添加公共解决了问题。
我有这个错误,因为在我的测试中我有两个期望,一个是模拟的,一个是具体的类型
MyClass cls = new MyClass();
MyClass cls2 = Mockito.mock(Myclass.class);
when(foo.bar(cls)).thenReturn(); // cls is not actually a mock
when(foo.baz(cls2)).thenReturn();
我通过将 cls 更改为模拟来修复它
就我而言,问题是由于试图模拟静态方法而忘记在类上调用mockStatic
引起的。我也忘了将类包含在@PrepareForTest()
中
TL;DR 如果测试中的某些参数null
,请务必使用 isNull()
而不是 anyXXX()
来模拟参数调用。
1.5.x 升级到 2.1.x 时,我遇到了此错误。 Spring boot 附带了自己的 Mockito,现在也升级到 2.x(参见例如 Spring boot 2.1.2 的依赖关系)
Mockito改变了anyXXX()
方法的行为,其中XXX
String
、Long
等。这是anyLong()
的javadoc:
从 Mockito 2.1.0 开始,只允许值
Long
,因此null
不再是有效值 作为原始包装器可为空,建议匹配的 APInull
包装器将是#isNull()
.我们感受到了这种变化将使测试利用比Mockito更安全1.x.
我建议你调试到你的模拟即将被调用的程度,并检查是否至少null
了一个参数。在这种情况下,请确保您用isNull()
而不是例如 anyLong()
.
所以这个:
when(MockedClass.method(anyString());
成为:
when(MockedClass.method(isNull());
就我而言,我同时使用了@RunWith(MockitoJUnitRunner.class)
和MockitoAnnotations.initMocks(this)
。当我删除MockitoAnnotations.initMocks(this)
时,它工作正常。
如果您使用的是注释,则可能需要使用 @Mock 而不是@InjectMocks。因为@InjectMocks一起工作@Spy,@Mock在一起。@Spy跟踪最近执行的方法,您可能会觉得返回/订阅了不正确的数据。
错误:
org.mockito.exceptions.misusing.WrongTypeOfReturnValue:
字符串不能按 size()
返回 size() 应该返回 int
如果您不确定为什么会出现上述错误,请继续阅读。
由于语法的性质,可能会出现上述问题,因为:
1. 此异常可能发生在错误编写的多线程中
测试。
请参考 Mockito 常见问题解答,了解并发测试的限制。
2. 间谍使用 when(spy.foo()).then() 语法进行存根。
更安全 存根间谍 -
- 与多返回|Throw() 系列方法。更多关于 javadocs 的内容
Mockito.spy() 方法。
实际代码:
@RunWith(PowerMockRunner.class)
@PrepareForTest({ Object.class, ByteString.class})
@Mock
private ByteString mockByteString;
String testData = “dsfgdshf”;
PowerMockito.when(mockByteString.toStringUtf8()).thenReturn(testData);
// throws above given exception
解决此问题的解决方案:
第一次删除注释"@Mock"。
private ByteString mockByteString;
第二个添加PowerMockito.mock
mockByteString = PowerMockito.mock(ByteString.class);
我最近在模拟 Kotlin 数据类中的函数时遇到了这个问题。由于某种未知原因,我的一次测试运行最终处于冻结状态。当我再次运行测试时,以前通过的一些测试开始失败,出现WrongTypeOfReturnValue
异常。
确保我使用org.mockito:mockito-inline
来避免期末课程的问题(Arvidaa提到),但问题仍然存在。对我来说,解决它的是终止该过程并重新启动Android Studio。这终止了我的冻结测试运行,以下测试运行顺利通过。
您要模拟的 bean 上缺少@MockBean
我WrongTypeOfReturnValue
遇到了这个问题,因为我模拟了一个返回带有com.google.common.base.Optional;
java.util.Optional;
的方法,因为我的格式化程序自动添加了缺少的导入。
Mockito只是在告诉我"方法某物()应该返回可选"......
在我的情况下,bean 已使用@Autowired注释而不是@MockBean
所以以这种方式嘲笑DAO和服务会抛出这样的异常
,问题是在共享模拟上进行存根/验证的多线程测试。它导致随机抛出WrongTypeOfReturnValue
异常。
这不是使用 Mockito 的正确书面测试。不应从多个线程访问模拟。
解决方案是在每个测试中本地进行模拟。
Android
就我而言,或者更确切地说Android
项目的仪器测试:
- 有一次,我只需要删除
build
目录(强制重建)。 - 还有一次,计算机内存不足,导致所有打开的应用程序出现问题,重新启动每个应用程序就足够了(无需重新启动计算机)。
也许一个错误的原因太多了!
(他们应该已经解决了这个问题)。
但我希望这对某人有所帮助
d= (◕‿↼ )
如今,因为命令行比 IDE 做得更好,稍后我在 IDE 中加载
test-result.pb
文件的命令行(所有测试完成后)。
我遇到了同样的问题!我在函数上创建了一个间谍,并像下面这样存根:
创建间谍
fktSpy: Class = Mockito.spy(class)
存根
Mockito.doReturn(value).`when`(fktSpy).function()
代码是用 Kotlin<</div> div class="one_answers" 编写的>
这是我的情况:
//given
ObjectA a = new ObjectA();
ObjectB b = mock(ObjectB.class);
when(b.call()).thenReturn(a);
Target target = spy(new Target());
doReturn(b).when(target).method1();
//when
String result = target.method2();
然后我得到这个错误:
org.mockito.exceptions.misusing.WrongTypeOfReturnValue:
ObjectB$$EnhancerByMockitoWithCGLIB$$2eaf7d1d cannot be returned by method2()
method2() should return String
你能猜到吗?
问题是 Target.method1() 是一个静态方法。莫基托完全警告我另一件事。
我正在使用 Scala,我收到这条消息,我错误地在两个Object
之间共享了一个模拟。因此,请确保您的测试彼此独立。并行测试执行显然会产生一些不稳定的情况,因为 Scala 中的对象是单例组合。
就我而言,事实证明模拟对象的类型实际上是一个抽象接口,将类型更改为某个实现类后问题得到解决,
改变
@Mock
private Proxy proxy;
自
@Mock
private ProxyImpl proxy;