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真的,真的谢谢你。我花了很多时间独自战胜它。