2017-08-02 23 views
0

私が受け取るエラーはorg.mockito.exceptions.misusing.UnfinishedStubbingExceptionです。考えられる理由の1つは、「完了したら、thenReturn命令が実行される前に別のモックの動作をスタブしています。モック作成中のモッキートモック作成

val mockHttpHandlerContext = mock<HttpHandlerContext>().let { 
     whenever(it.request).thenReturn(mock<HttpRequest>().let { 
      whenever(it.queryParameters).thenReturn(mapOf(
        "itype" to listOf("msisdn"), 
        "uid" to listOf(inputMsisdn) 
      )) 
      it 
     }) 
     whenever(it.scope()).thenReturn(ProcessingScope.of(Timings("test", 1000L))) 
     it 
    } 

ネストされたモック作成を取り除く唯一の解決策はありますか?実際にコードを理解するのが難しくなります。おそらく既知の回避策がありますか?

コードスニペットはKotlinです。

答えて

1

名前で判断すると、nhaarman/Mockito-Kotlinを使用しているとしますか?

Mockitoはステートフルですが、順番にモックを作成する必要がありますが、評価の順序を反転する方法はいくつかあります。例えば、

val mockHttpHandlerContext2 = mock<HttpHandlerContext>() { 
    mock<HttpRequest>() { 
     on { queryParameters }.thenReturn(mapOf(
       "itype" to listOf("msisdn"), 
       "uid" to listOf(inputMsisdn) 
     )) 
    }.let { on { request }.thenReturn(it) } 
    on { scope() }.thenReturn(ProcessingScope.of(Timings("test", 1000L))) 
} 

私はKStubbing<T>受信機とmock()過負荷を利用していますが、重要なビットは、スタブ上でそれを設定する.letを使用する前に、第一の内側のモックを作成しています。

スタブ付きメソッドが呼び出されるまで内部モックの作成を延期するには、​​を使用することもできます。

val mockHttpHandlerContext = mock<HttpHandlerContext>() { 
    on { request }.thenAnswer { 
     mock<HttpRequest>() { 
      on { queryParameters }.thenReturn(mapOf(
        "itype" to listOf("msisdn"), 
        "uid" to listOf(inputMsisdn) 
      )) 
     } 
    } 
    on { scope() }.thenReturn((ProcessingScope.of(Timings("test", 1000L))) 
} 

スタブされたメソッドが呼び出されるたびに新しいモックが作成されることに注意してください。内部モックで検証を実行する場合など、状況によっては望ましくない場合があります。

関連する問題