Кажется, проблема в том, что Mockito сериализует свои внутренние прокси-классы.Это отрицательно сказывается только в том случае, если задачи / задания, которые вы запускаете в Spark, действительно сериализуются и десериализуются.
В org.apache.spark.scheduler.ShuffleMapTask#runTask
задача десериализуется.Spark в основном делает в этот момент:
new JavaDeserializationStream(new ByteBufferInputStream(ByteBuffer.wrap(this.taskBinary.value())), ClassLoader.getSystemClassLoader()).objIn.readObject()
, который выдает точное сообщение об ошибке против
new ObjectInputStream(new ByteArrayInputStream(this.taskBinary.value())).readObject()
, которое будет работать и правильно анализировать объект.
В частности, кажется, что существует несоответствие между тем, как Java / Spark ожидает сериализации void
методов, и тем, что фактически делает Mockito: "java.lang.Void"
/ "Void"
против "void"
.
К счастью, Mockito позволяет вам указать способ сериализации своих макетов:
MockSettings mockSettings = Mockito.withSettings().serializable(SerializableMode.ACROSS_CLASSLOADERS);
writer = mock(Writer.class, mockSettings);
После этого изменения тест должен работать.
Обратите внимание, что, например, verify
вызовыtricky / не будет работать должным образом, если макет был сериализован, отправлен куда-то, десериализован и затем использован снова.Вызовы на макете не будут видны оригиналу writer
.