Public Groovy метод должен быть публичным, говорит компилятор - PullRequest
1 голос
/ 05 июня 2019

В чем причина этой ошибки и как ее исправить?

На первый взгляд, это похоже на дефект в отличном компиляторе.

:compileIntegrationTestGroovystartup failed:
C:\src\my-project\src\integration-test\groovy\my\project\MyServiceISpec.groovy: 31: The method setup should be public as it implements the corresponding method from interface my.project.MyTrait
. At [31:5]  @ line 31, column 5.
       public void setup() {
       ^

1 error

Мой тест интеграции Grails выглядит следующим образом:

@Integration
@Rollback
class MyServiceISpec extends Specification implements MyTrait {
    @Autowired
    MyService service

    OtherService otherService = Mock()

    public void setup() {
        myTraithMethod()
        service.otherService = otherService
    }
}

Моя черта выглядит так:

trait MyTrait {
    public void setup() {
        myTraithMethod()
    }

    private myTraitMethod() {
        ...
    }
}

Обновление Добавлено ключевое слово public в метод настройки черты.

Ответы [ 2 ]

3 голосов
/ 07 июня 2019

Я думаю, что источником этой проблемы является AST, потому что Спок использует преобразования AST и компилирует спецификацию. Вы можете прочитать здесь http://docs.groovy -lang.org / next / html / documentation / core-traits.html # _compatibility_with_ast_transformations this:

Черты официально не совместимы с преобразованиями AST. Некоторые из они, как @CompileStatic, будут применены к самой черте (не на реализации классов), в то время как другие будут применяться как на Реализация класса и черта. Там нет абсолютно никакой гарантии что преобразование AST будет работать по признаку, как это происходит на регулярной класс, так что используйте его на свой страх и риск!

Вы можете решить эту проблему, например, переименовав метод setup() в признаке на traitSetup() и вызвав его из метода спецификации setup() следующим образом:

@Integration
@Rollback
class MyServiceISpec extends Specification implements MyTrait {
    @Autowired
    MyService service
    OtherService otherService = Mock()

    void setup() {
        service.otherService = otherService
        traitSetup()
    }

    def 'some test here'() {
        ...
    }
}

trait MyTrait {
    void traitSetup() {
        myTraitMethod()
    }

    private myTraitMethod() {
        ...
    }
}
0 голосов
/ 05 июня 2019

1 / Не уверен, но имя черты - ResetsDatabase, и ваш тест реализует MyTrait.Возможно, какая-то путаница с чертами?2 / Мне кажется, что вы не можете использовать публичный метод в реализованном методе, если ваши черты говорят, что метод (настройка здесь) является приватным.

...