我应该如何使用 scalamock 模拟嵌套的Java类,尤其是当所说的嵌套Java类来自第三方库时?
提供以下来源:
src / main / java / Outer.java
/**
* Outer class that offers a Nested class inaccessible from Scala :(
*/
public class Outer {
public class Nested {
}
}
src / main / java / UseNestedJavaClassFromJava.java
public class UseNestedJavaClassFromJava {
private Outer.Nested nested;
}
src / main / scala / ImportNestedJavaClass.scala
// TODO uncomment the below line to break the build
//import Outer.Nested
取消对scala导入行的注释会导致编译失败,而编译 UseNestedJavaClassFromJava.java 可以正常工作。
带有gradle的完整最小示例:https://github.com/billyjf/async-http-client-gradle-scala。
以下问题显然已经解决了这个问题,但是仅仅为了测试利用带有嵌套Java类的Java库的Scala代码而采用Java粘合代码或反射技巧对我来说似乎有点不合理,是否真的存在没有其他解决方案了吗?
答案 0 :(得分:4)
我终于找到了使用Mockito的解决方案:
import org.mockito.Mockito
import org.scalamock.scalatest.MockFactory
import org.scalatest.mockito.MockitoSugar
import org.scalatest.{FlatSpec, Matchers}
class OuterNestedTest extends FlatSpec with MockFactory with Matchers with MockitoSugar {
"Nested Java class" should "be mockable using Mockito from within a scalatest" in {
val mockedNestedJavaClass = Mockito.mock(classOf[Outer#Nested])
Mockito.when(mockedNestedJavaClass.methodWithAParam("some value"))
.thenReturn("mocked", Nil: _*)
mockedNestedJavaClass.methodWithAParam("some value") shouldBe "mocked"
}
}
答案 1 :(得分:3)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'TEST': {
'NAME': os.path.join(BASE_DIR, 'other_db.sqlite3'),
}
}
}
更多背景信息:
与此类内部类是成员的类Java语言相反 封闭类的内部,在Scala中,此类内部类绑定到了 外物。