Использовать 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) { ... }
в каждом методе.
Возможно ли это?
Ответы
Ответ 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 не узнает его.