Подтвердить что ты не робот

Использовать Groovy Категорию неявно во всех экземплярах метода класса

У меня есть простой класс категорий Groovy, который добавляет метод к экземплярам String:

final class SampleCategory {

    static String withBraces(String self) {
        "($self)"
    }

}

Я хочу использовать эту категорию в своих модульных тестах (например). Это выглядит так:

class MyTest {
    @Test
    void shouldDoThis() {
        use (SampleCategory) {
            assert 'this'.withBraces() == '(this)'
        }
    }

    @Test
    void shouldDoThat() {
        use (SampleCategory) {
            assert 'that'.withBraces() == '(that)'
        }
    }
}

Однако я хотел бы указать, что категория SampleCategory используется в объеме каждого метода экземпляра MyTest, поэтому мне не нужно указывать use(SampleCategory) { ... } в каждом методе.

Возможно ли это?

4b9b3361

Ответ 1

Вы можете использовать mixin, чтобы применить категорию непосредственно к String metaClass. Назначьте значение null для metaClass до reset до groovy по умолчанию. Например:

@Before void setUp() { 
    String.mixin(SampleCategory)
}

@After void tearDown() {
    String.metaClass = null
}

@Test
void shouldDoThat() {
    assert 'that'.withBraces() == '(that)'
}

Ответ 2

Теперь у вас есть возможность использовать модули расширения вместо категорий: http://mrhaki.blogspot.se/2013/01/groovy-goodness-adding-extra-methods.html

На стороне плюса Intellij распознает расширения. Я только что заметил, что даже не обязательно должен быть отдельный модуль, предложенный ссылкой, просто добавьте в проект META-INF/services/org.codehaus.groovy.runtime.ExtensionModule:

# File: src/main/resources/META-INF/services/org.codehaus.groovy.runtime.ExtensionModule
moduleName = module
moduleVersion = 1.0
extensionClasses = SampleExtension

Класс расширения в значительной степени определяется как нормальная категория:

class SampleExtension {
    static String withBraces(String self) {
        "($self)"
    }
}

Может использоваться как:

def "Sample extension"() {
    expect: 'this'.withBraces() == '(this)'
}

Если вы используете Spock, вы можете использовать аннотацию @Use, которая может использоваться в спецификациях. Недостатком этого является то, что Intellij не узнает его.