Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java测试文件中使用ScalaTest?_Java_Scala_Scalatest - Fatal编程技术网

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

如何在Java测试文件中使用ScalaTest?,java,scala,scalatest,Java,Scala,Scalatest,可以在Java测试文件中使用ScalaTest,如果可以,我在哪里可以找到示例 当我尝试类似于: //MyUTest.java 导入org.scalatest.flatspec.AnyFlatSpec; 导入org.scalatest.matchers.should.matchers; 公共类MyUTest扩展了AnyFlatSpec、Matchers{ ... } 我得到一个错误,Matchers中的equal(Object)与Matchers.dsl.MatherWordsTL中的相同方法

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

当我尝试类似于:

//MyUTest.java
导入org.scalatest.flatspec.AnyFlatSpec;
导入org.scalatest.matchers.should.matchers;
公共类MyUTest扩展了AnyFlatSpec、Matchers{
...
}

我得到一个错误,
Matchers
中的
equal(Object)
Matchers.dsl.MatherWords
TL中的相同方法冲突;医生:你不能做你想做的事

如下列文件所述:

从Java的角度来看,Trait.scala被编译成Trait接口。因此,在Java中实现Trait被解释为实现一个接口——这使错误消息变得明显。简短回答:您不能利用Java中的trait实现,因为这将在Java中启用多重继承(!)

这是一种特质。但是,要解决此问题,您只需删除
匹配器
扩展,并使用测试类:

导入org.scalatest.flatspec.AnyFlatSpec;
公共类MyUTest扩展了AnyFlatSpec{
}
它将被编译。话虽如此,在Java中实际使用ScalaTest功能将非常困难。例如,一个简单的测试类将是:

public class MyUTest extends AnyFlatSpec {
    it should "test1" in { println("test1") }
}
上面的单词
should
声明为,也就是
trait
。所以你不能真正使用它。因此,我不确定如何克服这个问题,因为这是一个非常基本的例子


经过以上分析,我认为在Java中使用ScalaTest将非常困难。你能轻松做到的是,反过来。如果您已经支持Scala,并且有ScalaTest,那么您可以在Scala中测试java代码。它的“组织性”稍差一些,正如您希望看到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代码中的这些方法,如其他解决方法。

@TomerShetah:java 11,Scalatest 3.2.2。我可以使用Java 8,如果有帮助的话,还可以使用不同版本的ScalaTest。正如我在回答中所解释的,您必须在这个包装器中覆盖
Matchers
/
AnyFunSpec
中您想要使用的所有方法。我绝对不会走这条路。顺便问一下,
@Test
是什么?
sbt-test
会运行这样的测试吗?不会,我的主要想法是将代码
包装成{println(“test1”)}
中的“test1”到带有参数的java方法中,并从子类调用。我没想到
sbt
工具将成为建筑项目的唯一可能。我与
maven
gradle
一起工作,他们可以编译
scala
类,这要感谢插件
@Test
是用于定义测试插件将触发的方法的注释。