Использование Groovy Category неявно во всех методах экземпляра класса - PullRequest
12 голосов
/ 05 апреля 2011

У меня есть простой класс категории 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) { ... } в каждом методе. .

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

Ответы [ 2 ]

11 голосов
/ 05 апреля 2011

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

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

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

@Test
void shouldDoThat() {
    assert 'that'.withBraces() == '(that)'
}
1 голос
/ 17 сентября 2015

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

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

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

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

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

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

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

...