【问题标题】:mocking java.util.Iterator<?> in scalatest with easymock使用 easymock 在 scalatest 中模拟 java.util.Iterator<?>
【发布时间】:2014-12-12 21:19:10
【问题描述】:

我有一个使用 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)

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

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

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) }

【问题讨论】:

    标签: scala easymock scalatest scala-java-interop


    【解决方案1】:

    试试这个。在某些时候,您需要处理测试中的实际参数化类型。我还将测试修复为我认为您想要的,因为您的代码中的任何地方都没有真正提到“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)
          }
        }
      }
    }
    

    【讨论】:

    • 像魅力一样工作。我从来没有想过在方法本身上调用 asInstanceOf !谢谢! (是的,“A”是从示例的稍有不同的早期版本遗留下来的)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多