如何在 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") }
}
上面的单词 should
在 AnyFlatSpecLike, 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 代码中的这些方法,例如其他解决方法。
可以在 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") }
}
上面的单词 should
在 AnyFlatSpecLike, 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 代码中的这些方法,例如其他解决方法。