Сопоставитель свойств класса LambdaJ

Я пытаюсь написать сопоставитель Hamcrest для проверки возвращаемого значения метода, который возвращает объект класса. Например, для класса:

public static class ClassHolder {
    private final Class clazz;

    public ClassHolder(Class clazz) {
        this.clazz = clazz;
    }

    public Class getClazz() {
        return clazz;
    }
}

У меня есть тест, который создает сопоставитель Hamcrest для соответствия результату вызова getClazz():

public class LambdaJTest {
    @Test
    public void testClassHolder() {
        final ClassHolder classHolder = new ClassHolder(String.class);
        assertThat(classHolder, having(on(ClassHolder.class).getClazz(), is(String.class)));
    }
}

Однако этот сопоставитель выдает исключение при выполнении:

ch.lambdaj.function.argument.ArgumentConversionException: It is not possible to create a placeholder for class: java.lang.Class
    at ch.lambdaj.function.argument.ArgumentsFactory.createArgumentPlaceholder(ArgumentsFactory.java:170)
    at ch.lambdaj.function.argument.ArgumentsFactory.createArgumentPlaceholder(ArgumentsFactory.java:156)
    at ch.lambdaj.function.argument.ArgumentsFactory.createPlaceholder(ArgumentsFactory.java:52)
    at ch.lambdaj.function.argument.ArgumentsFactory.registerNewArgument(ArgumentsFactory.java:45)
    at ch.lambdaj.function.argument.ArgumentsFactory.createArgument(ArgumentsFactory.java:39)
    at ch.lambdaj.function.argument.ProxyArgument.invoke(ProxyArgument.java:36)
    at ch.lambdaj.proxy.InvocationInterceptor.intercept(InvocationInterceptor.java:42)

Есть ли способ написать такой сопоставитель, используя LambdaJ?


person Kkkev    schedule 11.10.2011    source источник


Ответы (1)


Для этого вам не нужен лямбдадж. Это можно сделать с помощью instanceOf matcher следующим образом:

assertThat(classHolder.getClazz(), Matchers.instanceOf(String.class)));

person Mario Fusco    schedule 16.10.2011
comment
Вы правы, мне не нужен LambdaJ; однако мой вопрос конкретно задавал, как это сделать с LambdaJ. Предположим, что ClassHolder содержит другое поле, и я хотел написать сопоставитель для сопоставления возвращаемого значения getClazz и этого нового поля. LambdaJ предоставляет удобный синтаксис для написания таких сопоставителей, но он не работает для методов, возвращающих Class объектов. - person Kkkev; 18.10.2011
comment
Похоже, это ограничение LambdaJ, поэтому я принял этот ответ на основании разумного обходного пути. - person Kkkev; 22.06.2012