Groovy регулярное выражение тест не пройден - PullRequest
1 голос
/ 20 июля 2011

В моем приложении Grails 1.3.6 я написал этот класс

import org.apache.commons.lang.StringUtils

/**
 * Implementation that converts a name such as <tt>FOO_BAR</tt> to <tt>fooBar</tt>
 */
@Singleton
class CamelCaseEnumTransformer implements EnumTransformer {

    String transformName(Enum e) {

        String transformedName = e.name().toLowerCase()

        transformedName.replaceAll(/_([a-z])/) {
            it[1].toUpperCase()
        }
        StringUtils.remove(transformedName, '_')
    }
}

Я создал этот тестовый пример:

class EnumTransformerTests extends GroovyTestCase {

    private static enum TestEnum {
        A, FOO, FOO_BAR, FOO_BAR_123,
    }

    void testCamelCaseTransformer() {
        EnumTransformer transformer = CamelCaseEnumTransformer.instance
        assertEquals 'a', transformer.transformName(TestEnum.A)
        assertEquals 'foo', transformer.transformName(TestEnum.FOO)

        // This test fails on the line below
        assertEquals 'fooBar', transformer.transformName(TestEnum.FOO_BAR)
    }
}

Тест не пройден на линии, отмеченной выше. Я считаю, что проблема должна быть связана с методом replaceAll, потому что это первый раз, когда выполняется замыкание, переданное как второй аргумент этого метода.

Я получаю ошибку:

groovy.lang.MissingMethodException: No signature of method: 
CamelCaseEnumTransformer$_transformName_closure1.doCall() 
is applicable for argument types: (java.lang.String, java.lang.String) values: [_b, b]

Что особенно странно, так это то, что если я запускаю приведенный ниже эквивалентный код в консоли Groovy, все, кажется, работает нормально.

@Singleton
class CamelCaseEnumTransformer {

    String transformName(Enum e) {

        String transformedName = e.name().toLowerCase()

        transformedName.replaceAll(/_([a-z])/) {
            it[1].toUpperCase()
        }
    }
}

enum TestEnum {
    A, FOO, FOO_BAR, FOO_BAR_123,
}

def transformer = CamelCaseEnumTransformer.instance
assert 'fooBar' == transformer.transformName(TestEnum.FOO_BAR)

1 Ответ

1 голос
/ 20 июля 2011

Из текста сообщения об ошибке похоже, что замыкание должно принимать 2 аргумента для 2 совпадений в вашем регулярном выражении.Попробуйте следующее:

    transformedName.replaceAll(/_([a-z])/) { wholeMatch, capturedGroups ->
        capturedGroups[0].toUpperCase();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...