为什么不能从Scala导入嵌套的Java类?

时间:2018-09-01 21:53:54

标签: scala

我应该如何使用 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粘合代码或反射技巧对我来说似乎有点不合理,是否真的存在没有其他解决方案了吗?

Scala can't access Java inner class?

2 个答案:

答案 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'),
        }
    }
}

更多背景信息:

  1. Outer.Inner被解释为Outer $ .Inner(伴侣对象)。
  2. Scala官方网站:
  

与此类内部类是成员的类Java语言相反   封闭类的内部,在Scala中,此类内部类绑定到了   外物。

https://docs.scala-lang.org/tour/inner-classes.html