Как установить @Value в MicronautTest? - PullRequest
0 голосов
/ 11 июня 2019

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

Микронавт поддерживает @ Value для чтения, а также "значений".

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

1 Ответ

4 голосов
/ 11 июня 2019

При тестировании я хочу установить «NameOfValue» на конкретное значение, как можно Я так делаю?

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

Одним из вариантов является определение 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() {
        // ...
    }
}

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

EDIT

Комментарий ниже включает в себя: «Я попробовал, но решение @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}". Если это на самом деле имя вашей конфигурационной переменной, обратите внимание, что в коде вам нужно сослаться на это в допустимом kebab-case, который будет "${name-of-value}".

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

...