当我运行模拟测试时,发生错误的返回值类型异常



错误详细信息:

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上。

  1. 为什么莫西托试图从updateItemAttributesByJuId返回boolean
  2. 如何纠正这种情况?
根据

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() 来模拟参数调用。

<小时 />从 Spring boot

1.5.x 升级到 2.1.x 时,我遇到了此错误。 Spring boot 附带了自己的 Mockito,现在也升级到 2.x(参见例如 Spring boot 2.1.2 的依赖关系)

Mockito改变了anyXXX()方法的行为,其中XXX StringLong等。这是anyLong()的javadoc:

从 Mockito 2.1.0 开始,只允许值 Long ,因此 null不再是有效值 作为原始包装器可为空,建议匹配的 API null包装器将是#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;

相关内容

  • 没有找到相关文章

最新更新