You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I have a test suite that overrides the executionContext, replacing serialExecutionContext with the scala default global executionContext.
This leads to transient errors because of MockitoSessionAsyncFixture.withFixture. This function calls session.finishMocking inside result.onOutcomeThen, which uses the implicit executionContext for the suite.
The problem is that finishMocking needs to be called from the same thread in which the MockitoScalaSession was called. This is due to listeners being stored in a thread-local variable. As long as you are using serialExecutionContext this happens naturally, but not if you use an actual multithreaded execution context.
In my case I was able to work around it by leaving the suite execution context the same and overriding the ec in different tests.
The resulting exception when this happens is:
Unfinished mocking session detected. Previous MockitoSession was not concluded with 'finishMocking()'. For examples of correct usage see javadoc for MockitoSession class. org.mockito.exceptions.misusing.UnfinishedMockingSessionException: Unfinished mocking session detected. Previous MockitoSession was not concluded with 'finishMocking()'. For examples of correct usage see javadoc for MockitoSession class. at ai.closedloop.lagom.ExampleServiceStreamingSpec.withFixture(ExampleServiceStreamingSpec.scala:13) at org.scalatest.wordspec.AsyncWordSpecLike.invokeWithAsyncFixture$1(AsyncWordSpecLike.scala:1060) at org.scalatest.wordspec.AsyncWordSpecLike.$anonfun$runTest$1(AsyncWordSpecLike.scala:1074) at org.scalatest.AsyncSuperEngine.runTestImpl(AsyncEngine.scala:374) at org.scalatest.wordspec.AsyncWordSpecLike.runTest(AsyncWordSpecLike.scala:1074) at org.scalatest.wordspec.AsyncWordSpecLike.runTest$(AsyncWordSpecLike.scala:1054) at ai.closedloop.lagom.ExampleServiceStreamingSpec.org$scalatest$BeforeAndAfterEach$$super$runTest(ExampleServiceStreamingSpec.scala:13) at org.scalatest.BeforeAndAfterEach.runTest(BeforeAndAfterEach.scala:234) at org.scalatest.BeforeAndAfterEach.runTest$(BeforeAndAfterEach.scala:227) at ai.closedloop.lagom.ExampleServiceStreamingSpec.runTest(ExampleServiceStreamingSpec.scala:13) at org.scalatest.wordspec.AsyncWordSpecLike.$anonfun$runTests$1(AsyncWordSpecLike.scala:1133) at org.scalatest.AsyncSuperEngine.$anonfun$runTestsInBranch$3(AsyncEngine.scala:435) at org.scalatest.Status.$anonfun$thenRun$1(Status.scala:227) at org.scalatest.Status.$anonfun$thenRun$1$adapted(Status.scala:225) at org.scalatest.Status$.executeQueue(Status.scala:417) at org.scalatest.ScalaTestStatefulStatus.setCompleted(Status.scala:600) at org.scalatest.Status.$anonfun$thenRun$2(Status.scala:237) at org.scalatest.Status.$anonfun$thenRun$2$adapted(Status.scala:228) at org.scalatest.Status$.executeQueue(Status.scala:417) at org.scalatest.ScalaTestStatefulStatus.setCompleted(Status.scala:600) at org.scalatest.Status.$anonfun$withAfterEffect$1(Status.scala:389) at org.scalatest.Status.$anonfun$withAfterEffect$1$adapted(Status.scala:373) at org.scalatest.Status$.executeQueue(Status.scala:417) at org.scalatest.ScalaTestStatefulStatus.setCompleted(Status.scala:600) at org.scalatest.FutureAsyncOutcome.$anonfun$new$1(AsyncOutcome.scala:45) at org.scalatest.FutureAsyncOutcome.$anonfun$new$1$adapted(AsyncOutcome.scala:39) at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:64) at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402) at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289) at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056) at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692) at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
The text was updated successfully, but these errors were encountered:
I have a test suite that overrides the executionContext, replacing serialExecutionContext with the scala default global executionContext.
This leads to transient errors because of
MockitoSessionAsyncFixture.withFixture
. This function callssession.finishMocking
insideresult.onOutcomeThen
, which uses the implicitexecutionContext
for the suite.The problem is that
finishMocking
needs to be called from the same thread in which theMockitoScalaSession
was called. This is due to listeners being stored in a thread-local variable. As long as you are usingserialExecutionContext
this happens naturally, but not if you use an actual multithreaded execution context.In my case I was able to work around it by leaving the suite execution context the same and overriding the ec in different tests.
The resulting exception when this happens is:
Unfinished mocking session detected. Previous MockitoSession was not concluded with 'finishMocking()'. For examples of correct usage see javadoc for MockitoSession class. org.mockito.exceptions.misusing.UnfinishedMockingSessionException: Unfinished mocking session detected. Previous MockitoSession was not concluded with 'finishMocking()'. For examples of correct usage see javadoc for MockitoSession class. at ai.closedloop.lagom.ExampleServiceStreamingSpec.withFixture(ExampleServiceStreamingSpec.scala:13) at org.scalatest.wordspec.AsyncWordSpecLike.invokeWithAsyncFixture$1(AsyncWordSpecLike.scala:1060) at org.scalatest.wordspec.AsyncWordSpecLike.$anonfun$runTest$1(AsyncWordSpecLike.scala:1074) at org.scalatest.AsyncSuperEngine.runTestImpl(AsyncEngine.scala:374) at org.scalatest.wordspec.AsyncWordSpecLike.runTest(AsyncWordSpecLike.scala:1074) at org.scalatest.wordspec.AsyncWordSpecLike.runTest$(AsyncWordSpecLike.scala:1054) at ai.closedloop.lagom.ExampleServiceStreamingSpec.org$scalatest$BeforeAndAfterEach$$super$runTest(ExampleServiceStreamingSpec.scala:13) at org.scalatest.BeforeAndAfterEach.runTest(BeforeAndAfterEach.scala:234) at org.scalatest.BeforeAndAfterEach.runTest$(BeforeAndAfterEach.scala:227) at ai.closedloop.lagom.ExampleServiceStreamingSpec.runTest(ExampleServiceStreamingSpec.scala:13) at org.scalatest.wordspec.AsyncWordSpecLike.$anonfun$runTests$1(AsyncWordSpecLike.scala:1133) at org.scalatest.AsyncSuperEngine.$anonfun$runTestsInBranch$3(AsyncEngine.scala:435) at org.scalatest.Status.$anonfun$thenRun$1(Status.scala:227) at org.scalatest.Status.$anonfun$thenRun$1$adapted(Status.scala:225) at org.scalatest.Status$.executeQueue(Status.scala:417) at org.scalatest.ScalaTestStatefulStatus.setCompleted(Status.scala:600) at org.scalatest.Status.$anonfun$thenRun$2(Status.scala:237) at org.scalatest.Status.$anonfun$thenRun$2$adapted(Status.scala:228) at org.scalatest.Status$.executeQueue(Status.scala:417) at org.scalatest.ScalaTestStatefulStatus.setCompleted(Status.scala:600) at org.scalatest.Status.$anonfun$withAfterEffect$1(Status.scala:389) at org.scalatest.Status.$anonfun$withAfterEffect$1$adapted(Status.scala:373) at org.scalatest.Status$.executeQueue(Status.scala:417) at org.scalatest.ScalaTestStatefulStatus.setCompleted(Status.scala:600) at org.scalatest.FutureAsyncOutcome.$anonfun$new$1(AsyncOutcome.scala:45) at org.scalatest.FutureAsyncOutcome.$anonfun$new$1$adapted(AsyncOutcome.scala:39) at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:64) at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402) at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289) at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056) at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692) at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
The text was updated successfully, but these errors were encountered: