在 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
字段。无论如何,这是一种代码味道。
我正在尝试在我的测试 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
字段。无论如何,这是一种代码味道。