【问题标题】:Mokito throwing WrongTypeOfReturnValueMockito 抛出 WrongTypeOfReturnValue
【发布时间】:2014-10-16 16:47:30
【问题描述】:

实现类中的逻辑如下图,我试着写了一个mock并得到异常为WrongTypeOfReturnValue

  /**
     * update audit and courier log when Provider sign the document.
     * @param cmsCourierInfo
     * @param documentInfo
     * @throws Exception
     */
    public boolean doAuditProviderESignCompletion(CMSCourierInfo cmsCourierInfo, DocumentInfo documentInfo) throws  Exception {

        String signerTitle = "";
        List<ParticipantInfo> participantInfos = documentInfo.getParticipants().getParticipantInfo();
        //First participant is Provider
        ParticipantInfo participantInfo = participantInfos.get(0);

        if(StringUtils.isNotEmpty(participantInfo.getTitle())){
            signerTitle = participantInfo.getTitle();
        }
        //update audit log with provider signed information
        CMSCourierContractManager.signContract(cmsCourierInfo.getGuidString(), participantInfo.getName(), signerTitle, null);

        //update audit log when document sent to Internal Signer
        return doAuditSentForInternalSigner(cmsCourierInfo.getDocumentKey(), documentInfo);
    }

测试

   @Test
   public void testUpdateContractStatus() throws Exception{

        String documentKey = "TestKey";
        cmsCourierInfo = mock(CMSCourierInfo.class);
        when(cmsFactoryManager.findCourier(anyString())).thenReturn(cmsCourierInfo);
        EchoSignDocumentServiceImpl echoSignDocumentService = spy(documentService);
        when(echoSignDocumentService.updateContractStatus(anyString())).thenReturn(true);

        doThrow(new RuntimeException()).when(echoSignDocumentService).updateContractStatus(anyString());
        boolean status = echoSignDocumentService.updateContractStatus(documentKey);
        Assert.assertEquals(true, status);
    }

我得到的错误是

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
Boolean cannot be returned by findCourier()
findCourier() should return CMSCourierInfo
***

If you're unsure why you're getting above error read on.
Due to the nature of the syntax above problem might occur because:
1. This exception *might* occur in wrongly written multi-threaded tests.
   Please refer to Mockito FAQ on limitations of concurrency testing.
2. A spy is stubbed using when(spy.foo()).then() syntax. It is safer to stub spies - 
   - with doReturn|Throw() family of methods. More in javadocs for Mockito.spy() method.


at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

一些输入会有很大帮助

【问题讨论】:

    标签: java mockito


    【解决方案1】:

    我无法解释您遇到的具体错误(我可能需要查看更多代码)。但是测试中肯定存在编码错误。就在您调用updateContractStatus() 之前,您告诉模拟程序在使用任何字符串值调用此方法时抛出异常。因此,您永远不会得到分配的返回值,也永远不会到达 assert 语句。

    另外,因为我看不到您的所有代码,我只是在猜测,但根据发布的错误帮助消息,您可以尝试将 spy 类的存根更改为以下形式:

    doReturn(true).when(echoSignDocumentService).updateContractStatus(anyString());
    

    【讨论】:

      【解决方案2】:

      您显然处于错误消息的第二种情况:您正在使用 when-then 而不是 doReturn-when 语法对 spy (echoSignDocumentService) 进行存根

      【讨论】:

        【解决方案3】:

        就我而言,我忘了写eq()

        given(repository.getTitle(eq(variable))).willReturn(title)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-04-06
          • 2017-04-20
          • 2017-07-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多