如何在Java测试文件中使用ScalaTest



可以在Java测试文件中使用ScalaTest,如果可以,我在哪里可以找到示例?

当我尝试类似的东西时:

// MyUTest.java
import org.scalatest.flatspec.AnyFlatSpec;
import org.scalatest.matchers.should.Matchers;
public class MyUTest extends AnyFlatSpec, Matchers {
...
}

我得到一个错误,Matchers中的equal(Object)matchers.dsl.MatherWords中的相同方法冲突

TL;DR:你不能做你想做的事。

如在Java中使用Scala特性和实现的方法:中所述

从Java的角度来看,Trait.scala被编译到Trait接口中。因此,在Java中实现Trait被解释为实现了一个接口——这使得错误消息显而易见。简言之:您不能利用Java中的trait实现,因为这将在Java中实现多重继承(!(

Matchers是一个特征。然而,为了克服这个问题,您可以删除Matchers扩展,并拥有测试类:

import org.scalatest.flatspec.AnyFlatSpec;
public class MyUTest extends AnyFlatSpec {

}

它将编译。话虽如此,在Java中实际使用ScalaTest功能将非常困难。例如,一个简单的测试类是:

public class MyUTest extends AnyFlatSpec {
it should "test1" in { println("test1") }
}

上面的单词should是在AnyFlatSpecLike中声明的,它也是trait。所以你不能真正使用它。所以我真的不确定你如何克服这个问题,因为这是你可以在ScalaTest快速入门中找到的非常基本的例子。

经过以上分析,我认为在Java中使用ScalaTest将非常困难。你能轻而易举地做的事,恰恰相反。如果您已经支持Scala,并且您有ScalaTest,那么您可以在Scala中测试java代码。它有点少";有组织的";正如您期望在java文件夹下看到的那样,我们刚刚证明了这是不可能的。我认为拥有这个";一团糟;是这种结构中的最佳解决方案。

我完全同意@Tomer Shetah的观点。我想补充一点,你可以在scala:上为java创建包装器

class JavaScalaTestWrapper extends AnyFunSpec with Matchers {
def println(x : scala.Any) = Predef.println(x)
def shouldEqual(x : scala.Int, ) = SomeCode.someFunc(x) shouldBe s"${x}"
}

之后,您可以通过以下包装器扩展所有java测试类:

public class SomeOperationTestJava extends JavaScalaTestWrapper {
@Test
void someOperation() {
SomeOperation so = new SomeOperation();
println("=== test ===");
assert(("test").equals(so.someOperation()));
shouldEqual(3);
}
}

所有scala风格的代码都可以放在包装器中,然后使用原始java代码中的这些方法,就像其他的解决方法一样。

最新更新