2017-05-10 63 views
4

を呼び出していない、非常に私は私のオブジェクトをあざける除いて何もしなかったし、私が確認しMockitoは私はユニットテストを持っている

GSLClient gslClient = spy(new GSLSolaceClient()); 
    String orgId = "10006"; 
    int orgFlag = Destination.ORG_ID_INPUT_FLAG_APP; 
    String eventId = "11010000"; 
    String scenario = "01"; 
    String inputDCN = "A00"; 
    String GSLRetDCN = "FT0"; 

    //mock 
    when(gslClient.requestTargetDCNFromGSLServer(mockGSLBizSeqNo,orgId, eventId, scenario, orgFlag)) 
      .thenReturn(buildMockSuccessGSLRespMsg(GSLResponse.ORG_FALG_GSL_INPUT, GSLRetDCN))//success for first time 
      .thenThrow(new GSLClient.GSLInvokeTimeoutException("Mock GSL timeout"));//timout for the second time 

    verify(gslClient, never()).requestTargetDCNFromGSLServer(mockGSLBizSeqNo,orgId, eventId, scenario, orgFlag); 

を開始するには奇妙な問題を見つけるんけれどもスパイた後oncesと呼ばれる方法を確認しますモックメソッドが呼び出されることはありません。

しかし、結果は私に与える:

org.mockito.exceptions.verification.NeverWantedButInvoked: 
gSLSolaceClient.requestTargetDCNFromGSLServer(
    "MOCKGSLBIZSEQNO_GSL_CACHE_TEST", 
    "10006", 
    "11010000", 
    "01", 
    0 
); 
Never wanted here: 
-> at cn.webank.rmb.gsl.GSLCacheTest.test_76789232(GSLCacheTest.java:226) 
But invoked here: 
-> at cn.webank.rmb.gsl.GSLCacheTest.test_76789232(GSLCacheTest.java:222) 


    at cn.webank.rmb.gsl.GSLCacheTest.test_76789232(GSLCacheTest.java:226) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    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.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
    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:68) 
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:237) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) 

このメソッドを呼び出して、他の場所はので、私は

 when(gslClient.requestTargetDCNFromGSLServer(mockGSLBizSeqNo,orgId, eventId, scenario, orgFlag)) 
      .thenReturn(buildMockSuccessGSLRespMsg(GSLResponse.ORG_FALG_GSL_INPUT, GSLRetDCN))//success for first time 
      .thenThrow(new GSLClient.GSLInvokeTimeoutException("Mock GSL timeout"));//timout for the second time 

が続いて結果が渡されたコードを削除がしようとした場合、私はその実際を証明し、疑問に思います他にこのメソッドを呼び出す場所はありません。

しかし、なぜ私はこの結果を与えるのですか?

私は以下のテストを試しましたが、合格しました!

{ 
     //test mock 
     Date mockD = spy(new Date()); 
     when(mockD.getTime()) 
       .thenReturn(1l) 
       .thenThrow(new RuntimeException("mock ex")); 
     verify(mockD, never()).getTime(); 
    } 

-------------------方法requestTargetDCNFromGSLServerの原点implemationは--------------

似ていますあなたはモックの順に固執する必要がありますので、
Message requestTargetDCNFromGSLServer(String bizSeqNo, String targetOrgId,String serviceEventId,String scenario,int orgFlag) throws RMBValidationException, RMBIllegalAccessException, GSLInvokeTimeoutException { 
    System.out.println("-------------------------------------------------------requestTargetDCNFromGSLServer");//I can only see this log one time 
    SysHeader msgHeader = Util.createSysHeader(bizSeqNo,bizSeqNo, SOURCESYSID); 
    Destination destination = Util.createSimpleDestination(GSL_SERVICEID,GSL_SCENARIO,GSL_DCN); 
    Message reqMessage = Util.createMessage(msgHeader, GSL_APPHEADER,destination, createRequestContent(targetOrgId,serviceEventId,scenario,orgFlag)); 
    IMessagePublisher synPublisher = getSyncPublisherInstance(); 
    reqMessage.setTimeToLive(Global.onlyInstance().getGslRequestTimeout()); 
    Message rspMessage = synPublisher.publish(reqMessage, Global.onlyInstance().getGslRequestTimeout()) ; 
    if(rspMessage == null) { 
     throw new GSLClient.GSLInvokeTimeoutException("Cannot recieve GSL response at "+ Global.onlyInstance().getGslRequestTimeout()+" ms"); 
    }else { 
     return rspMessage; 
    } 

} 
+0

'requestTargetDCNFromGSLServer'メソッドの宣言を提供できますか?あなたのインターフェースとクラスの両方で。 –

+0

@SergheyBishyr、すでに質問に表示されています。そして、インターフェイスはありません。このメソッドは抽象クラス 'GSLClient'で宣言されています – Jaskey

答えて

0

あなたは、スパイをからかっている:あなたがエラーを取得する理由

doReturn(buildMockSuccessGSLRespMsg(GSLResponse.ORG_FALG_GSL_INPUT, GSLRetDCN)) 
    .doThrow(new GSLClient.GSLInvokeTimeoutException("Mock GSL timeout")) 
    .when(gslClient).requestTargetDCNFromGSLServer(
      mockGSLBizSeqNo,orgId, eventId, scenario, orgFlag); 

をあなたの現在の状況では、あなたが嘲笑しながら、実際の実装を呼び出している、thatsの。設定を開始すると、Mockitoはwhenメソッド内のスパイで実際のメソッド呼び出しを "保護"することができます。

+0

あなたのソリューションが助けになるかもしれませんが、私はこの質問で問題を再現できません。私は別の問題があると仮定します。 –

+0

私は別のモックオブジェクト 'Date'を試してみました。それは' getTime() 'mothodですが問題はありません。だから私の緊急の必要性のために、私は嘲笑するときに私の問題を解決することができます、あなたはまた、私はmockitoに新しいので、理由を指摘しますか?問題の理由を議論する必要があります。なぜなら、同じメソッドを 'Date'に使用すると問題はないということです。 – Jaskey

+0

Okですが、微妙な詳細が含まれている可能性があるため、コードをテストすることに固執します。変更後も同じエラーが表示されますか? –

関連する問題