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

How can one use ScalaTest in a Java test file?

可以在 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:你不能做你想做的事。

Using Scala traits with implemented methods in Java所述:

From Java perspective Trait.scala is compiled into Trait interface. Hence implementing Trait in Java is interpreted as implementing an interface - which makes your error messages obvious. Short answer: you can't take advantage of trait implementations in Java, because this would enable multiple inheritance in Java (!)

Matchers 是一个特征。但是,要克服这个问题,您可以删除 Matchers 扩展名,并进行测试 class:

import org.scalatest.flatspec.AnyFlatSpec;

public class MyUTest extends AnyFlatSpec {
    
}

这将编译。话虽如此,实际使用 Java 中的 ScalaTest 功能真的很难。例如,一个简单的测试 class 将是:

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

上面的单词 shouldAnyFlatSpecLike, which is trait as well. So you cannot really use it. So I am not really sure how you can overcome this issue, as this is the very basic example that you can find in ScalaTest quick start 声明。

经过以上分析,我认为在Java中使用ScalaTest会非常困难。您可以轻松做到的是相反的方法。如果你已经支持 Scala,并且你有 ScalaTest,你可以在 Scala 中测试 java 代码。正如您希望在 java 文件夹下看到 java 测试 classes 那样,它的“组织性”有点低,我们刚刚证明这是不可能的。我认为这种“混乱”是这种结构中最好的解决方案。

我完全同意@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 代码中的这些方法,例如其他解决方法。