Spring Boot 集成测试:模拟环境接口
Posted
技术标签:
【中文标题】Spring Boot 集成测试:模拟环境接口【英文标题】:Spring Boot Integration Test : Mock Environment Interface 【发布时间】:2021-04-09 04:20:51 【问题描述】:在我的 Spring Security UserDetailsService
中,我注入 Environment
以从 env 变量中读取凭据。
在集成测试中,我想模拟 Environment
接口以更改测试的环境变量。
这是我的测试:
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = EportfolioApplication.class)
@AutoConfigureMockMvc
public class IntegrationAuth
@Autowired
private MockMvc mockMvc;
@Autowired
private ObjectMapper objectMapper;
@Test
void loginCorrectCredentials_returnsToken() throws Exception
User user = new User();
user.setUsername("John Shepard");
user.setPassword("Tali");
MvcResult mvcResult = mockMvc.perform(post("/login")
.contentType("application/json")
.content(objectMapper.writeValueAsString(user)))
.andExpect(status().isOk())
.andReturn();
assertNotNull(
"JWT Token should be present",
mvcResult.getResponse().getHeader("Authorization")
);
最好的方法是什么?
【问题讨论】:
【参考方案1】:您可以使用@TestPropertySource#properties
。从它的javadoc:
在为测试加载
ApplicationContext
之前,应将键值对形式的内联属性添加到 SpringEnvironment
。所有键值对都将作为具有最高优先级的单个测试 PropertySource 添加到封闭环境中。
这是一个最小的例子:
@Service
class MyService(
environment: Environment
)
private val foo = environment["com.caco3.demo.foo"]
fun getFoo() = foo
测试:
@SpringBootTest
@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL)
@TestPropertySource(properties = ["com.caco3.demo.foo=test"])
class ApplicationTest(
private val service: MyService
)
@Test
fun fooIsEqualToTest()
assertEquals("test", service.getFoo())
【讨论】:
以上是关于Spring Boot 集成测试:模拟环境接口的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot + 云 | Zuul 代理 |集成测试
spring boot使用TestRestTemplate集成测试 RESTful 接口