在 Quarkus 测试中将值注入私有字段

Injecting values into private field in Quarkus test

我正在尝试在我的测试 class 中使用 Quarkus 应用程序中的 FieldSetter 将值设置为私有字段(Quarkus 版本:1.5.2.Final 和 JDK version:11)

主要Class

@ApplicationScoped
public class TokenService{
    @Inject @RestClient RestClientInterface client;

    private String someVariable;

    public String someMethod(){}
}

测试Class

@QuarkusTest
public class TokenServiceTest{
    @Inject TokenService service;
    @InjectMock @RestClient RestClientInterface client;

    @Test
    public void someMethodTest(){
       FieldSetter.setField(service, "someVariable", "someValue");
    }
}

但 FieldSetter 抛出 NoSuchField 错误。请帮忙。 也试过

service.getClass().getdeclaredField("someVariable")

但同样的问题。

提前致谢。

TokenService class 是 @ApplicationScoped。这意味着如果你 @Inject 它在某处, class 的一个实例是 而不是 直接注入的。相反,注入的是所谓的 客户端代理 ,它是原始 class 的 subclass。这个 subclass 负责在每次方法调用时查找正确的实例(并将调用转发给实例)。

这个子class自然声明someVariable。这就是 getDeclaredField("someVariable") 失败的原因。我假设 FieldSetter 来自 Mockito——在这种情况下,它会做同样的事情并因同样的原因而失败。

您可以将 TokenService 设为 @Singleton——在这种情况下没有客户端代理,直接注入一个实例——或者使用客户端代理是一个子class 简单看一个superclass。或者 - 这可能是最好的 - 重新设计您的代码,这样您就不必从外部更改 private 字段。无论如何,这是一种代码味道。