При тестировании я хочу установить «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}"
.
Надеюсь, это поможет.