Шов 2.2 изменить значение введенного поля с помощью отражения

Я использую Seam 2.2. Я хочу получить приватное поле из компонента Seam, используя Reflections. Так что я:

    LocalizationEditActionRoot localizationEditActionRoot = (LocalizationEditActionRoot) Component
                        .getInstance(LocalizationEditActionRoot.class, true);
    Class currentClass = localizationEditActionRoot.getClass();
    WebDavMockClient mockClient = new WebDavMockClient();
    Field f = currentClass.getDeclaredField("davClient");
    f.setAccessible(true);
    f.set(localizationEditActionRoot, mockClient);

Если я хочу получить поле с именем davClient(WebDavClient) Я получаю NoSuchFieldException. Поле, конечно, вводится. Если я попробую что-то вроде этого:

    Class currentClass = Class.forName("fr.isiom.bpms.admin.session.ext.action.root.LocalizationEditActionRoot");
    WebDavMockClient mockClient = new WebDavMockClient();
    Field f = currentClass.getDeclaredField("davClient");
    f.setAccessible(true);
    f.set(localizationEditActionRoot, mockClient);

Я получаю поле davClient но значение не изменилось. Он все еще является экземпляром WebDavClient вместо WebDavMockClient. Как я могу изменить это значение поля?

1 ответ

Решение

Мне не удалось сделать это с отражением. Вместо этого я нашел более простую идею / решение. В моем тестовом классе в методе Create/setUp я получаю sessionContext из контекста шва и изменяю имя webDavClient, чтобы связать его с WebDavMockClient вместо WebDavClient. И вот как вы решаете всю эту проблему с помощью одной строки:

// Setting webDavClient to be injected by seam as WebDavMockClient to mock the actual delete
Contexts.getSessionContext().set("webDavClient", new WebDavMockClient());
Другие вопросы по тегам