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

标签 groovy metaprogramming categories metaclass

我有简单的 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) { ... }在每种方法中。

是否可以?

最佳答案

您可以使用 mixin 将类别直接应用于 String 的元类。为元类分配 null 以将其重置为常规默认值。例如:

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

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

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

关于groovy - 在类的所有实例方法中隐式使用 Groovy Category,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5552180/

相关文章:

intellij-idea - 如何在gradle.build中调试空指针异常

jenkins - 在 groovy 中以 10000 递增循环

c++ - 如何迭代打印 std::tuple

c++ - 用于对类进行不同的部分特化的 Varadiac 宏

groovy - 有没有办法在变量中声明 Groovy 字符串格式?

c++ - 如何根据某些模板参数影响模板类方法的返回类型?

wordpress - 是否可以在 WordPress 中测试空术语或类别?

iphone - 类别与非正式协议(protocol)

MySql:选择类别 id=2 和 3 的所有帖子