0

我使用Seam 2.2。我想使用反射从 Seam 组件中获取私有字段。所以我有:

    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。如何更改该字段值?

4

1 回答 1

0

我还没有设法通过反思来做到这一点。相反,我找到了一个更简单的想法/解决方案。在我的测试类中,在 Create/setUp 方法中,我从 Seam Context 获取 sessionContext,并将 webDavClient 名称更改为与 WebDavMockClient 而不是 WebDavClient 绑定。这就是你如何用一条线来解决整个问题:

// Setting webDavClient to be injected by seam as WebDavMockClient to mock the actual delete
Contexts.getSessionContext().set("webDavClient", new WebDavMockClient());
于 2012-11-21T13:48:42.487 回答