Шов 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());