【问题标题】:Configuration values are not loaded when testing private method测试私有方法时不加载配置值
【发布时间】:2017-03-21 09:48:04
【问题描述】:

我有一堂课:

    @Service
    public class MyService{
        @Value("${some.value}")
        private String someValue;

        private String someMethod(String inputString){
           return inputString == null || inputString.isEmpty() ? someValue : inputString;
        } 
    }

在属性文件中 some.value 定义如下:

some.value=SomeValue

然后我尝试使用 ReflectionTestUtils 测试 someMethod:

public class MyTest{

   @Value("${some.value}")
   private String someValue;

   @Autowired
   private MyService myService;

   @Test
   public void testSomeMethod() {
       Assert.assertEquals(someValue, ReflectionTestUtils.invokeMethod(myService, "someMethod", ""));
   }
}

我收到以下错误:

java.lang.AssertionError:预期:SomeValue 实际:null

调试时,我看到我正在测试的服务内部 - 配置值为空。

更奇怪的是(对我来说 :))如果我将 someMethod 从 private 更改为 public,一切正常。

【问题讨论】:

  • 让我猜这不是您正在测试的实际代码,而是一个简化版本,在您的实际应用程序中,您的代码需要/需要 AOP,如事务、安全等。
  • 是简化版。由于项目中还有很多其他的东西,我认为不相关,有什么具体的你需要知道的吗?
  • 是的,无论你是否使用 AOP(尽管我怀疑我已经知道答案)。我怀疑您在此处发布的示例(没有 AOP)可以正常工作,但是一旦您在混合中添加 AOP,它(似乎)就不起作用。

标签: java spring unit-testing


【解决方案1】:

在您的班级中添加此注释:

   @RunWith(SpringJUnit4ClassRunner.class)
   @PropertySource("classpath:name-file.properties ")

并在您的测试包资源中添加文件:

src/test/resources/name-file.properties

【讨论】:

  • 它不起作用,我的属性文件已经在 src/test/resources 下。问题是它仅在测试私有方法时才起作用。
  • 试试这个 system.getProperty("keyforproperties");
猜你喜欢
  • 2019-03-12
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多