Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从正在测试的方法的application.properties中读取变量_Java_Spring_Unit Testing - Fatal编程技术网

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

Java 如何从正在测试的方法的application.properties中读取变量,java,spring,unit-testing,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

我有课:

@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()
中可用?

您可以尝试覆盖如下属性:

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

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

如果您正在对代码进行单元测试, 那么就没有必要让弹簧做它自己的事情了。 相反 你只需要实例化你的类, 设置Spring为您设置的值, 执行您正在测试的方法, 然后验证您的方法是否正确执行

下面是我建议重写的单元测试示例:

public class TestA
{
  private static final String VALUE_ABC = "VALUE_ABC";

  private A classToTest;

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

  @Before
  public void preTestSetup()
  {
    classToTest = new A();

    ReflectionTestUtils.setField(
      classToTest,
      "abc",
      VALUE_ABC)
  }
}
一些注意事项:

  • 反射测试是弹簧测试的一部分
  • 您不需要使用
    @InjectMocks
    ,因为您没有要注入的mock
  • 我不知道sout是什么,所以我把它排除在测试之外。您应该验证是否使用正确的值调用了sout方法(在本例中为value_ABC)
  • 如果您只是对代码进行单元测试,则不需要Spring,这意味着您不需要使用
    @RunWith
    注释

  • 像这样:
    @SpringBootTest({“a.b.c=myValue”})
    我试过了。还null@AntonKolosok尝试将类
    TestA
    中的
    @InjectMocks
    注释替换为
    @Autowired
    一个更好的解决方案的可能副本是使用构造函数注入,这通常可以让您完全避免涉及Spring,只需执行
    新的A(myTestAbc)
    。foo()中仍然有null真的,真的谢谢你。我花了很多时间独自战胜它。