【问题标题】:How to set a @Value in a MicronautTest?如何在 MicronautTest 中设置 @Value?
【发布时间】:2019-06-11 08:00:57
【问题描述】:

我使用 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) {
    ...
  }
  ...
}

testing 时,我想将“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
  }
}

【问题讨论】:

    标签: java junit micronaut


    【解决方案1】:

    测试的时候,我想把“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() {
            // ...
        }
    }
    

    希望对你有帮助。

    编辑

    下面的评论包括“我确实尝试过,但 @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}"

    希望对你有帮助。

    【讨论】:

    • 当然,您可以使用some-special-test-props.yml 或我们支持的任何其他配置格式来代替some-special-test-props.properties
    • 感谢您的反馈。我确实尝试过,但 @Property 解决方案和 some-special-test-props.properties 都适用于我的情况。我想我必须深入挖掘,也许会打开一个错误报告。
    • 我创建了一个项目来演示它是如何工作的。我在与此相关的答案中添加了一些注释。
    • 很好的反馈,对我帮助很大!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    相关资源
    最近更新 更多