Использование инфраструктуры Spock с Groovy 2.6+ для поддержки синтаксиса Java 8+ - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть библиотека Java, скомпилированная с использованием синтаксиса JDK 9.Но я использую spock-core:1.0-groovy-2.4, который не поддерживает синтаксис JDK 8+.Итак, в моем Java-коде я могу использовать лямбда-выражения, методы по умолчанию и ссылки на методы.Но в моих тестах я не могу.Я должен использовать неуклюжий обходной путь для лямбд, где я пишу замыкание Groovy, а затем приведу его к Function<...>, используя ключевое слово as.Но другой синтаксис, такой как ссылки на методы, такие как Class::method, просто не будет компилироваться.Ниже приведен раздел зависимостей моего build.gradle.

Как мне обновить его так, чтобы я использовал более новую версию Groovy, которая поддерживает более новые версии Java?

Кажется, что вся документация тамбыть устаревшим и содержать только ссылки на Groovy 2.4.

dependencies {
  testCompile(
    'junit:junit:4.12',
    'org.codehaus.groovy:groovy-all:2.4.4',
    'org.spockframework:spock-core:1.0-groovy-2.4',
    'org.springframework.boot:spring-boot:1.2.1.RELEASE',
    'cglib:cglib-nodep:2.2.2',
    'com.opencsv:opencsv:4.1'
  )
}

1 Ответ

0 голосов
/ 19 мая 2018

Даже при работе со Spock 1.2-groovy-2.4-SNAPSHOT и Groovy 3.0.0-alpha-1 вы не можете напрямую использовать лямбда-код и синтаксис методов Java, я только что протестировал его в своем примере проекта Spock / Geb Maven в IntelliJ IDEA , Но даже со Spock 1.1 и Groovy 2.4.7 довольно просто и элегантно заменить лямбды и ссылки на методы без приведения или as, насколько я видел в своем быстром тесте:

package de.scrum_master.stackoverflow

import groovy.transform.ToString
import groovy.transform.TupleConstructor
import spock.lang.Specification

class LambdaMethodRefTest extends Specification {

  def "Replace lambdas and method references in Groovy"() {
    given:
    def bookStream = [
      new Book("Fortran", "Fred", 1957, 57.99),
      new Book("Java in 3 Days", "Alice", 2005, 11.99),
      new Book("Java in 4 Days", "Bob", 2005, 22.99),
      new Book("Filter-Map-Reduce with Lambdas", "Claire", 2014, 33.99)
    ].stream()

    when:
    def mapReduceResult = bookStream
      .filter { it.year >= 2004 }
      .peek(System.out.&println)
      .map { it.author }
      .map { it.toUpperCase() }
      .peek { System.out.println(it) }
      .reduce("", { s1, s2 -> (s1.isEmpty()) ? s2 : s1 + ", " + s2 })

    then:
    mapReduceResult == "ALICE, BOB, CLAIRE"
  }

  @TupleConstructor
  @ToString(includeNames = true, includePackage = false)
  static class Book {
    String title, author; int year; double price
  }

}

Обратите внимание на два разных способа звонка System.out.println - на ваш выбор. ; -)

Журнал консоли:

LambdaMethodRefTest$Book(title:Java in 3 Days, author:Alice, year:2005, price:11.99)
ALICE
LambdaMethodRefTest$Book(title:Java in 4 Days, author:Bob, year:2005, price:22.99)
BOB
LambdaMethodRefTest$Book(title:Filter-Map-Reduce with Lambdas, author:Claire, year:2014, price:33.99)
CLAIRE

Что именно вам не хватает?


Обновление: Почему-то мой старый код, использующий .map(String.&toUpperCase), больше не работает после того, как я изменил некоторые вещи в своем проекте Maven. Интересно, почему это сработало раньше? Поэтому я обновил пример кода.

...