mocking java.util.Iterator<?> in scalatest with easymock



我有一个使用java库(cipango(的scala项目。我正在尝试模拟库中返回java.util.Iterator的方法之一。 在scala方面,我有一个scala.collections.Iterator[_],我正在使用scala.collections.JavaConversions进行转换。 但它不会编译,并且失败并显示以下消息:

Error:(63, 60) type mismatch;
found   : java.util.Iterator[_$1] where type _$1
required: java.util.Iterator[?0] where type ?0
   mockSipApplicationSessions(id).getSessions.andReturn(sessionsAsJavaIterator)

(一个可能不相关的细节,但我要提到的是,sessionsAsJavaIterator 中的实际元素本身就是 java 接口的模拟。

我创建了一个小示例,显示了类似的问题。 该示例的错误消息不完全相同,但非常相似。

爪哇岛:

import java.util.Iterator;
public interface IterateMe {
    Iterator<?> getSomething();
}
public class SomeClass {
}

斯卡拉:

import org.scalatest.mock.EasyMockSugar
import org.scalatest.{Matchers, FunSpecLike}
import scala.collection.JavaConversions._
class AdhocSpec extends FunSpecLike  with Matchers with EasyMockSugar {
  describe("IterateMe") {
    it("can not be mocked!") {
      val m = mock[IterateMe]
      val toReturn: java.util.Iterator[_] = Iterator(mock[SomeClass])
      expecting { m.getSomething().andReturn(toReturn) }
      whenExecuting(m) {
        m.getSomething.next() should equal("A")
      }
    }
  }
}

编译错误:

Error:(13, 46) type mismatch;
 found   : java.util.Iterator[(some other)_$1(in value <local AdhocSpec>)] where type (some other)_$1(in value <local AdhocSpec>)
 required: java.util.Iterator[_$1(in value <local AdhocSpec>)] where type _$1(in value <local AdhocSpec>)
      expecting { m.getSomething().andReturn(toReturn) }

试试这个。在某些时候,您需要在测试中处理实际的参数化类型。我还将测试固定为我认为您想要的测试,因为"A"在您的代码中并没有真正提及。

import org.scalatest.mock.EasyMockSugar
import org.scalatest.{Matchers, FunSpecLike}
import scala.collection.JavaConversions._
class AdhocSpec extends FunSpecLike with Matchers with EasyMockSugar {
  describe("IterateMe") {
    it("can be mocked!") {
      val m = mock[IterateMe]
      val someObject: SomeClass = mock[SomeClass]
      val toReturn: java.util.Iterator[SomeClass] = Iterator[SomeClass](someObject)
      expecting {m.getSomething.asInstanceOf[java.util.Iterator[SomeClass]].andReturn(toReturn) }
      whenExecuting(m) {
        m.getSomething.next() should equal(someObject)
      }
    }
  }
}

最新更新