如何在测试中覆盖单个应用程序 属性
How to override a single application property in a test
我有这个测试:
@ExtendWith(SpringExtension.class)
@WebMvcTest(AuthController.class)
@TestPropertySource("classpath:application.properties")
class AuthControllerTest {
@Autowired
private MockMvc mvc;
@Autowired
AuthTokenFilter authTokenFilter;
@MockBean
AuthEntryPointJwt authEntryPointJwt;
@MockBean
JwtUtils jwtUtils;
@Autowired
private ObjectMapper objectMapper;
@MockBean
UserDetailsServiceImpl userDetailsServiceImpl;
@MockBean
AuthenticationManager authenticationManager;
@MockBean
Authentication authentication;
@MockBean
SecurityContext securityContext;
@Test
void test1withEnabledTrue() {
}
@Test
void test2WithEnabledTrue() {
}
@Test
void cannotRegisterUserWhenRegistrationsAreDisabled() throws Exception {
var userToSave = validUserEntity("username", "password");
var savedUser = validUserEntity("username", "a1.b2.c3");
when(userDetailsServiceImpl.post(userToSave)).thenReturn(savedUser);
mvc.perform(post("/api/v1/auth/register/").contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsBytes(userToSave))).andExpect(status().isCreated())
.andExpect(jsonPath("$.status", is("registrations are disabled")));
}
private static UsersEntity validUserEntity(String username, String password) {
return UsersEntity.builder().username(username).password(password).build();
}
}
这是控制器中的相关部分(Class 测试中):
@Value("${app.enableRegistration}")
private Boolean enableRegistration;
private Boolean getEnableRegistration() {
return this.enableRegistration;
}
@PostMapping("/register")
@ResponseStatus(HttpStatus.CREATED)
public Map<String, String> post(@RequestBody UsersDTO usersDTO) {
Map<String, String> map = new LinkedHashMap<>();
if (getEnableRegistration()) {
[...]
map.put("status", "ok - new user created");
return map;
}
map.put("status", "registrations are disabled");
return map;
}
我在 src/test/resources
下有这个 application.properties
,我需要覆盖它,仅用于我名为 cannotRegisterUserWhenRegistrationsAreDisabled
的单个测试
app.enableRegistration=true
也许我可以使用另一个文件“application.properties”和另一个 class 测试,但我正在寻找更智能的解决方案。
您可以简单地配置 @TestPropertySource
的内联 properties
,它比从 locations
/ value
加载的属性具有更高的优先级:
@WebMvcTest(AuthController.class)
@TestPropertySource(locations = "classpath:application.properties" ,properties="app.enableRegistration=true" )
class AuthControllerTest {
}
properties
中指定的所有内联属性将覆盖 application.properties
中指定的那些
我认为您正在寻找的是 @TestProperty
注释,它是 Whosebug here 上的一个问题的答案。然而,这仅适用于 class 级别,而不是仅适用于一次测试。
您可能需要进行新测试 class 并在值需要为 false
的地方添加测试。
我有这个测试:
@ExtendWith(SpringExtension.class)
@WebMvcTest(AuthController.class)
@TestPropertySource("classpath:application.properties")
class AuthControllerTest {
@Autowired
private MockMvc mvc;
@Autowired
AuthTokenFilter authTokenFilter;
@MockBean
AuthEntryPointJwt authEntryPointJwt;
@MockBean
JwtUtils jwtUtils;
@Autowired
private ObjectMapper objectMapper;
@MockBean
UserDetailsServiceImpl userDetailsServiceImpl;
@MockBean
AuthenticationManager authenticationManager;
@MockBean
Authentication authentication;
@MockBean
SecurityContext securityContext;
@Test
void test1withEnabledTrue() {
}
@Test
void test2WithEnabledTrue() {
}
@Test
void cannotRegisterUserWhenRegistrationsAreDisabled() throws Exception {
var userToSave = validUserEntity("username", "password");
var savedUser = validUserEntity("username", "a1.b2.c3");
when(userDetailsServiceImpl.post(userToSave)).thenReturn(savedUser);
mvc.perform(post("/api/v1/auth/register/").contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsBytes(userToSave))).andExpect(status().isCreated())
.andExpect(jsonPath("$.status", is("registrations are disabled")));
}
private static UsersEntity validUserEntity(String username, String password) {
return UsersEntity.builder().username(username).password(password).build();
}
}
这是控制器中的相关部分(Class 测试中):
@Value("${app.enableRegistration}")
private Boolean enableRegistration;
private Boolean getEnableRegistration() {
return this.enableRegistration;
}
@PostMapping("/register")
@ResponseStatus(HttpStatus.CREATED)
public Map<String, String> post(@RequestBody UsersDTO usersDTO) {
Map<String, String> map = new LinkedHashMap<>();
if (getEnableRegistration()) {
[...]
map.put("status", "ok - new user created");
return map;
}
map.put("status", "registrations are disabled");
return map;
}
我在 src/test/resources
下有这个 application.properties
,我需要覆盖它,仅用于我名为 cannotRegisterUserWhenRegistrationsAreDisabled
app.enableRegistration=true
也许我可以使用另一个文件“application.properties”和另一个 class 测试,但我正在寻找更智能的解决方案。
您可以简单地配置 @TestPropertySource
的内联 properties
,它比从 locations
/ value
加载的属性具有更高的优先级:
@WebMvcTest(AuthController.class)
@TestPropertySource(locations = "classpath:application.properties" ,properties="app.enableRegistration=true" )
class AuthControllerTest {
}
properties
中指定的所有内联属性将覆盖 application.properties
我认为您正在寻找的是 @TestProperty
注释,它是 Whosebug here 上的一个问题的答案。然而,这仅适用于 class 级别,而不是仅适用于一次测试。
您可能需要进行新测试 class 并在值需要为 false
的地方添加测试。