如何从正在测试的方法的application.properties中读取变量

时间:2018-11-27 18:52:40

标签: java spring unit-testing

我上课:

@Service
public class A {

  @Value("${a.b.c}")
  private String abc;

  public void foo() {
   sout(abc);
  }
}

我有测试课:

@SpringBootTest
@SpringBootConfiguration
@RunWith(SpringRunner.class)
@TestPropertySource(locations = "classpath:application.yml")
public class TestA {

  @Value("${a.b.c}")
  private String abc;

  @InjectMocks
  private A a;

  @Test
  public void testFoo() {
    this.a.foo();
  }
}

当我调试测试方法testFoo()时, 我看到从abc文件中读取了变量application.yml。 但, 在foo()方法中, 我看到变量abc为空。 尝试测试此方法时,如何设置变量abc使其在方法foo()中可用?

2 个答案:

答案 0 :(得分:1)

第一步是要回答这个问题:我是在对类中的代码进行单元测试还是对Spring和包含我的类的代码集合的组合进行集成测试?

如果您正在对代码进行单元测试, 那么就没有必要让Spring做它的事情。 代替, 您只需要实例化您的课程, 设置Spring将为您设置的值, 执行您正在测试的方法, 然后验证您的方法是否正确执行。

这是按照我的建议重写的示例单元测试:

ReflectionTestUtils

一些注意事项:

  1. @InjectMocks是春季测试的一部分。
  2. 您无需使用sout,因为您无需注入任何模拟内容。
  3. 我不知道@RunWith是什么,因此我从测试中排除了它。您应该验证以正确的值(在本例中为VALUE_ABC)调用了sout方法。
  4. 如果您只是对代码进行单元测试,则不需要Spring,这意味着您不需要使用latitude = input("Latitude: ") longitude = input("Longitude: ") height = input("Height: ") br.open("https://usa.wavedb.com/channelsearch/tvws") br.select_form ("latitude") br['latitude'] = latitude # query br.select_form ("longitude") br['longitude'] = longitude br.select_form ("heightAgl") br['heightAgl'] = height response = br.submit() print(response.read()) 批注。

答案 1 :(得分:0)

您可以尝试覆盖这样的属性:

@TestPropertySource(locations = "location.properties",
  properties = "a.b.c=123")

示例取自here