Mar*_*lte 0 java junit micronaut
我使用Micronaut作为开发 AWS Java Lambda 的框架。
Micronaut 支持@Value来读取“值”。
@io.micronaut.context.annotation.Factory
public class SomeFactory {
public SomeFactory(
@io.micronaut.context.annotation.Value("${NameOfValue}")
final String value) {
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
当测试,我想“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
}
}
Run Code Online (Sandbox Code Playgroud)
测试时,我想将“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() {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
然后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() {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助。
编辑
下面的评论包括“我确实尝试过,但@Property 解决方案和 some-special-test-props.properties 都适用于我的情况。”。我创建了一个示例应用程序来演示这些技术中的每一种。请参阅https://github.com/jeffbrown/markusschultevalue 上的项目。
package markusschultevalue;
public class SomeWidget {
private final String name;
public SomeWidget(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
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());
}
}
Run Code Online (Sandbox Code Playgroud)
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());
}
}
Run Code Online (Sandbox Code Playgroud)
some:
config:
value: Some Other Widget Name
Run Code Online (Sandbox Code Playgroud)
请注意,在您的示例中,您使用"${NameOfValue}". 如果这实际上是您的配置变量的名称,请注意在代码中您需要在有效的 kebab-case 中引用它,即"${name-of-value}".
我希望这有帮助。
| 归档时间: |
|
| 查看次数: |
1519 次 |
| 最近记录: |