在类的所有实例方法中隐式使用Groovy Category

oia*_*kyi 12 groovy metaprogramming metaclass categories

我有简单的Groovy类类,它为String实例添加了方法:

final class SampleCategory {

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

}
Run Code Online (Sandbox Code Playgroud)

我想在我的单元测试中使用这个类别(例如).它看起来像这样:

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

    @Test
    void shouldDoThat() {
        use (SampleCategory) {
            assert 'that'.withBraces() == '(that)'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我想要实现的是能够指定SampleCategory在每个实例方法的范围内使用类别,MyTest因此我不必use(SampleCategory) { ... }在每个方法中指定.

可能吗?

ata*_*lor 11

您可以使用mixin将类别直接应用于String的metaClass.将null分配给metaClass以将其重置为groovy默认值.例如:

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

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

@Test
void shouldDoThat() {
    assert 'that'.withBraces() == '(that)'
}
Run Code Online (Sandbox Code Playgroud)