Java Micronaut测试模拟bean无法注入值

Java Micronaut测试模拟bean无法注入值,java,testing,integration-testing,micronaut,Java,Testing,Integration Testing,Micronaut,我试图测试一个依赖bean工作的类,我想模拟它。这个bean需要一个字符串值,它是使用@ConfigurationProperties从我的application.yml文件接收的,这可能是问题所在,因为在同一测试类中模拟的其他bean可以正常工作。正常运行应用程序也可以正常工作,因此错误似乎在某种程度上与@MockBean有关 我有一个配置类,它从应用程序.yml获取值: @Data @ConfigurationProperties("some_api") public class SomeA

我试图测试一个依赖bean工作的类,我想模拟它。这个bean需要一个字符串值,它是使用
@ConfigurationProperties
从我的
application.yml
文件接收的,这可能是问题所在,因为在同一测试类中模拟的其他bean可以正常工作。正常运行应用程序也可以正常工作,因此错误似乎在某种程度上与
@MockBean
有关

我有一个配置类,它从
应用程序.yml
获取值:

@Data
@ConfigurationProperties("some_api")
public class SomeApiDaoConfig {
    private String url;
}
此外,该值在integrationTest
application.yml
文件中设置:

some_api:
  url: http://localhost:8082
还有这个工厂,它创建bean:

@Factory
public class SomeApiDaoFactory {

  @Singleton
  public SomeApiDao someApiDao(SomeApiDaoConfig someApiDaoConfig) {
    return new SomeApiDao(someApiDaoConfig.getUrl());
  }
}

测试类别基本上是:

@MicronautTest(packages = {"<<path to someApiDao>>"})
public class ServiceTest {
  @Inject private BlockingStub blockingStub;
  @Inject private AnotherDao anotherDao;
  @Inject private SomeApiDao someApiDao;

@BeforeEach
  void setUp() {
    MockitoAnnotations.initMocks(this);
  }

... (tests)

@MockBean(AnotherDao.class)
  AnotherDao anotherDao() {
    return mock(AnotherDao.class);
  }

@MockBean(SomeApiDao.class)
  SomeApiDao someApiDao() {
    return mock(SomeApiDao.class);
  }
@MicronautTest(包={'})
公共类服务测试{
@注入私人堵塞器堵塞器;
@注入私有的另一个道,另一个道;
@注入私有SomeApiDao SomeApiDao;
@之前
无效设置(){
initMocks(this);
}
…(测试)
@MockBean(另一个dao.class)
另一个{
返回mock(另一个dao.class);
}
@MockBean(SomeApiDao.class)
SomeApiDao SomeApiDao(){
返回mock(SomeApiDao.class);
}
但是,当我运行测试时,当它尝试初始化SomeApiDao bean时,会弹出此错误:

Failed to inject value for parameter [url] of class: <path to test>.$ServiceTest$SomeApiDao3Definition$Intercepted

Message: No bean of type [java.lang.String] exists. Make sure the bean is not disabled by bean requirements (enable trace logging for 'io.micronaut.context.condition' to check) and if the bean is enabled then ensure the class is declared a bean and annotation processing is enabled (for Java and Kotlin the 'micronaut-inject-java' dependency should be configured as an annotation processor).
Path Taken: new GrpcEmbeddedServer(ApplicationContext applicationContext,ApplicationConfiguration applicationConfiguration,GrpcServerConfiguration grpcServerConfiguration,[ServerBuilder serverBuilder],ApplicationEventPublisher eventPublisher,ComputeInstanceMetadataResolver computeInstanceMetadataResolver,List metadataContributors) --> ServerBuilder.serverBuilder(GrpcServerConfiguration configuration,[List serviceList],List interceptors,List serverTransportFilters) --> new Service([SomeApiDao someApiDao]) --> new $ServiceTest$SomeApiDao3Definition$Intercepted([String url],BeanContext beanContext,Qualifier qualifier,Interceptor[] interceptors)
io.micronaut.context.exceptions.DependencyInjectionException: Failed to inject value for parameter [url] of class: <path to test>.$ServiceTest$SomeApiDao3Definition$Intercepted
未能为类的参数[url]注入值:。$ServiceTest$SomeApiDao3Definition$已拦截
消息:不存在[java.lang.String]类型的bean。请确保该bean未被bean要求禁用(启用“io.micronaut.context.condition”的跟踪日志以进行检查),如果该bean已启用,则确保将该类声明为bean并启用注释处理(对于Java和Kotlin,“micronaut注入Java”依赖项应配置为注释处理器)。
采取的路径:新的GrpcEmbeddedServer(ApplicationContext ApplicationContext,ApplicationConfiguration ApplicationConfiguration,GrpcServerConfiguration GrpcServerConfiguration,[ServerBuilder ServerBuilder],ApplicationEventPublisher eventPublisher,ComputeInstanceMetadataResolver ComputeInstanceMetadataResolver,列出metadataContributors)-->ServerBuilder.ServerBuilder(GrpcServerConfiguration配置,[List serviceList],List interceptors,List serverTransportFilters)--->新服务([SomeApiDao SomeApiDao])-->new$ServiceTest$SomeApiDao3Definition$Intercepted([String url],BeanContext BeanContext,限定符,Interceptor[]interceptors)
io.micronaut.context.exceptions.DependencyInjectionException:未能为类的参数[url]注入值。$ServiceTest$SomeApiDao3Definition$已拦截
我假设
@Data
是Lombok注释,因此它正在为
url
创建一个构造函数参数。Micronaut直到1.3才支持将配置键注入构造函数参数,它要求构造函数用
ConfigurationInject
注释


我假设
@Data
是Lombok注释,因此它正在为
url
创建一个构造函数参数。Micronaut直到1.3才支持将配置键注入构造函数参数,它要求构造函数用
ConfigurationInject

注释,感谢您的响应!但是,我已经为您提供了升级到Micronaut 1.3,并将我的类更改为使用文档中所述的
ConfigurationInject
,在测试中尝试模拟此bean时仍然会出现相同的错误。@ClaudioCarvalho我唯一可以假设的是,您没有正确完成某些操作。您应该更新您的问题,说明您是如何使用
@ConfigurationInJet
感谢您的回复!但是,我已经更新到Micronaut 1.3,并将我的类更改为使用文档中描述的
ConfigurationInJet
,在测试中尝试模拟此bean时,它仍然会给我相同的错误。@ClaudioCarvalho我唯一可以假设的是您没有正确地完成某些操作您应该更新您的问题,说明您是如何使用
@configurationnject
@Data
@ConfigurationProperties("some_api")
public class SomeApiDaoConfig {
    private String url;
}