Тестовый микронавтский тестовый боб не может ввести значения - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь протестировать класс, который зависит от bean-компонента, который я хотел бы высмеять. Для этого бина требуется строковое значение, полученное из моего application.yml файла с использованием @ConfigurationProperties, и это, вероятно, проблема, поскольку другие бины, смоделированные в том же тестовом классе, работают нормально. Запуск приложения обычно также работает просто отлично, поэтому ошибка, похоже, как-то связана с @MockBean.

У меня есть этот класс конфигурации, который получает значение из application.yml:

@Data
@ConfigurationProperties("some_api")
public class SomeApiDaoConfig {
    private String url;
}

Кроме того, значение устанавливается в файле integraTest application.yml:

some_api:
  url: http://localhost:8082

А также эта фабрика, которая создает компонент:

@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);
  }

Однако, когда я запускаю тесты, появляется эта ошибка, когда он пытается инициализировать компонент SomeApiDao:

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

1 Ответ

0 голосов
/ 07 февраля 2020
@Data
@ConfigurationProperties("some_api")
public class SomeApiDaoConfig {
    private String url;
}

Я предполагаю, что @Data - это аннотация Lombok, поэтому он создает аргумент конструктора для url. Micronaut не поддерживал введение ключей конфигурации в аргументы конструктора до версии 1.3 и требует, чтобы конструктор был помечен ConfigurationInject

...