Как установить @Value в MicronautTest?

Я использую Микронавт в качестве основы для разработки AWS Java Lambda.

Micronaut поддерживает @Стоимость для чтения ну и "значений".

@io.micronaut.context.annotation.Factory
public class SomeFactory {
  public SomeFactory(
    @io.micronaut.context.annotation.Value("${NameOfValue}") 
    final String value) {
    ...
  }
  ...
}

Когда тестирование, я хочу установить для NameOfValue определенное значение, как мне это сделать?

@io.micronaut.test.annotation.MicronautTest
class SomeLambdaIT {

  @org.junit.jupiter.api.Test
  void aTest() {
    // When this test runs, "NameOfValue" shall be set to a specific value
  }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
2 265
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

When testing, I want to set "NameOfValue" to a specific value, how can I do that?

У вас есть несколько вариантов.

Один из вариантов — определить src/test/resources/application-test.yml и указать там настройки конфигурации. Этот файл будет загружен только в тестовой среде, и любые настройки, определенные в этом файле, заменят значения, определенные в src/main/resources/application.yml.

Другой вариант, который может иметь смысл, если вы хотите использовать специальные настройки только для этого конкретного теста, - вы можете сделать что-то вроде этого...

import io.micronaut.test.annotation.MicronautTest;
import org.junit.jupiter.api.Test;


@MicronautTest(propertySources = "classpath:some-special-test-props.properties")
public class SomeTest {

    @Test
    void someTest() {
        // ...
    }
}

Затем определите src/test/resources/some-special-test-props.properties и присвойте там значение.

Еще один вариант — пометить тест знаком @Property:

import io.micronaut.context.annotation.Property;
import io.micronaut.test.annotation.MicronautTest;
import org.junit.jupiter.api.Test;

@MicronautTest
@Property(name = "some.config.value", value = "My Test Value")
public class SomeTest {


    @Test
    void someTest() {
        // ...
    }
}

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ

Комментарий ниже включает в себя: «Я попробовал, но в моем случае не работает ни решение @Property, ни some-special-test-props.properties». Я создал пример приложения, демонстрирующий каждый из этих методов. Смотрите проект на https://github.com/jeffbrown/markusschultevalue.

https://github.com/jeffbrown/markusschultevalue/blob/8131e96492356180e2c7fade09603bd41f8c8829/src/main/java/markusschultevalue/SomeWidget.java

package markusschultevalue;

public class SomeWidget {
    private final String name;

    public SomeWidget(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

https://github.com/jeffbrown/markusschultevalue/blob/master/src/main/java/markusschultevalue/SomeFactory.java

package markusschultevalue;

import io.micronaut.context.annotation.Bean;
import io.micronaut.context.annotation.Factory;
import io.micronaut.context.annotation.Value;

@Factory
public class SomeFactory {

    private final String name;

    // there are better ways to do this but
    // this is consistent with the code in the
    // question being asked...
    public SomeFactory(@Value("${some.config.value}") String name) {
        this.name = name;
    }

    @Bean
    public SomeWidget createWidget() {
        return new SomeWidget(name);
    }
}

https://github.com/jeffbrown/markusschultevalue/blob/8131e96492356180e2c7fade09603bd41f8c8829/src/test/java/markusschultevalue/PropertyAnnotationTest.java

package markusschultevalue;

import io.micronaut.context.annotation.Property;
import io.micronaut.test.annotation.MicronautTest;
import org.junit.jupiter.api.Test;

import javax.inject.Inject;

import static org.junit.jupiter.api.Assertions.assertEquals;

@MicronautTest
@Property(name = "some.config.value", value = "Some Widget Name")
public class PropertyAnnotationTest {

    @Inject
    SomeWidget someWidget;

    @Test
    void testWidget() {
        assertEquals("Some Widget Name", someWidget.getName());
    }
}

https://github.com/jeffbrown/markusschultevalue/blob/8131e96492356180e2c7fade09603bd41f8c8829/src/test/java/markusschultevalue/ConfigFileTest.java

package markusschultevalue;

import io.micronaut.test.annotation.MicronautTest;
import org.junit.jupiter.api.Test;

import javax.inject.Inject;

import static org.junit.jupiter.api.Assertions.assertEquals;

// This will load the config value
// from src/test/resources/some-widget-test-config.yml
@MicronautTest(propertySources = "classpath:some-widget-test-config.yml")
public class ConfigFileTest {

    @Inject
    SomeWidget someWidget;

    @Test
    void testWidget() {
        assertEquals("Some Other Widget Name", someWidget.getName());
    }
}

https://github.com/jeffbrown/markusschultevalue/blob/8131e96492356180e2c7fade09603bd41f8c8829/src/test/resources/some-widget-test-config.yml

some:
  config:
    value: Some Other Widget Name

Обратите внимание, что в вашем примере вы ссылаетесь на переменную конфигурации с помощью "${NameOfValue}". Если это на самом деле имя вашей переменной конфигурации, обратите внимание, что в коде вам нужно указать это в допустимом регистре кебаба, который будет "${name-of-value}".

Надеюсь, это поможет.

Конечно, вместо some-special-test-props.properties вы можете использовать some-special-test-props.yml или любой другой формат конфигурации, который мы поддерживаем.

Jeff Scott Brown 11.06.2019 17:50

Спасибо за ответ. Я попробовал, но в моем случае не работает ни решение @Property, ни some-special-test-props.properties. Я думаю, что мне нужно копнуть глубже и, возможно, открыть отчет об ошибке.

Markus Schulte 12.06.2019 09:36

Я создал проект, который демонстрирует, как это работает. Я добавил некоторые примечания к моему ответу, связанному с этим.

Jeff Scott Brown 12.06.2019 16:07

Отличный отзыв, мне очень помог!

Markus Schulte 12.06.2019 19:07

Другие вопросы по теме