在单个项目中混合使用java和scala—scala测试,java核心

在单个项目中混合使用java和scala—scala测试,java核心,java,scala,unit-testing,testing,Java,Scala,Unit Testing,Testing,假设有人更喜欢功能风格的测试框架(例如规范),而不喜欢Java的行业标准框架(例如JUnit)。让一个Java项目只使用scala编写单元/集成测试(其他项目使用Java编写),这是一个好的实践吗?这种方法有什么缺点吗?我在几个项目中使用了它,例如使用Spock(groovy)、scala测试。这是评估、学习和使用新编程语言的非常有效的方法。 有什么缺点吗? 如果您的团队使用持续集成,那么您可能需要花费一些时间来配置Maven/Gradle,以包括您的测试和其他配置,以便CI可以构建它。我对此

假设有人更喜欢功能风格的测试框架(例如规范),而不喜欢Java的行业标准框架(例如JUnit)。让一个Java项目只使用scala编写单元/集成测试(其他项目使用Java编写),这是一个好的实践吗?这种方法有什么缺点吗?

我在几个项目中使用了它,例如使用Spock(groovy)、scala测试。这是评估、学习和使用新编程语言的非常有效的方法。
有什么缺点吗?
如果您的团队使用持续集成,那么您可能需要花费一些时间来配置Maven/Gradle,以包括您的测试和其他配置,以便CI可以构建它。

我对此有一些经验,我们以前使用过

缺点:

  • Scala知识:从开发人员的角度来看,如果他们只编写用于测试的Scala代码,他们将不会学到太多,因为其他一些Scala功能,如隐式、类型级编程等将不会得到很好的使用

  • 类型转换:类型转换非常烦人。几乎所有Java集合都是可变的,如ArrayList、HashMap等,但Scala Seq、List、Map将作为不可变集合导入,因此您需要始终使用Scala.Collection.JavaConversion来转换这些集合。更不用说java中的BigDecimal之类的其他类型,您还需要对其进行转换

  • 慢编译:如果您使用Specs2,它可能会相对地增加您的编译时间,我个人认为它可能使用隐式太多,每个测试方法都必须返回匹配结果,这种类型是隐式查找而不是显式查找。如果在没有任何匹配器的情况下编写测试,则可以看到隐式not found错误。无论如何,编译可能很耗时

  • 缺少IDE对TDD的支持,我正在使用intellij 13 ultimate edition,在Java中,我喜欢做TDD,而且速度很快,但在Scala测试中,它不太支持它,alt+enter没有给我太多有用的选项

  • 不要尝试混合导入Java和Scala代码,因此现在在您的项目中,Scala代码正在测试包中使用Java代码,如果某些Java测试代码导入Scala代码,则可能会混淆IDE。Intellij不够聪明,无法先编译哪一个。我们也有这个问题,我们只是手动编译Scala测试代码,然后构建项目,但这有点令人沮丧

  • 我不太喜欢只使用Scala进行测试。Scala是一种令人惊叹的语言,它提供了如此多的功能,让您可以编写富有表现力且优雅的代码

    关于在Java核心项目上尝试使用Scala的几点建议(可能会偏离主题)

    微服务:据我所知,Java核心项目的朋友们正在使用微服务作为在Java之上编写Scala代码的解决方案。但是,在某些情况下,它可能会增加不必要的维护工作量

    Jar:您还可以通过创建Scala项目将其分离,然后打包一个Jar,发布到您的公司Nexus,然后将其导入Java项目。我认为这是一个干净的解决方案,因为它们都位于JVM之上,开发人员不会抱怨编译问题


    我想其他人也可能有类似的经历,我希望我能学到:)

    从技术上讲,这样做是可能的,但我认为这不是正确的做法。 如果您的团队知道/愿意学习scala,那么他们可能希望用scala编写整个代码,而不仅仅是测试(或者至少对新代码这样做)。
    如果团队不了解scala,学习曲线很高,而且由于测试通常会限制范围,他们不会从中学到很多东西。
    如果您试图使用测试来偷袭scala,则可能会得到相反的效果。
    scala存在一些问题(比如强大的IDE支持、冗长的编译、与第三方工具的集成等等)。我认为在scala中开发时支付它是值得的,但如果不限于测试的话

    如果您只想用更实用的方式编写测试,我建议您使用。这是一个非常好的Java和Groovy测试和规范框架。由于groovy本身对java开发人员来说很熟悉,所以他们可能会觉得使用它更舒服。

    我以前开始使用它,但后来用scala重写了整个应用:)

    如果你的团队准备好了,那就开始吧。大多数scala/Java互操作问题都是在Java->scala时出现的。Scala->Java非常完美。