@WebMvcTest 没有看到@Value 注解

问题描述 投票:0回答:1

我创建了一个 MessageSourceConfig,如下所示:

@Configuration
public class MessageSourceConfig {

    @Value("${spring.messages.basename}")
    private String[] basenames;

    @Bean
    public ReloadableResourceBundleMessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();

        messageSource.setBasenames(basenames);
        messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());

        return messageSource;
    }
}

以及像 TodoController 这样的典型控制器:

@RestController
@RequestMapping("api/v1/todos")
@RequiredArgsConstructor
public class TodoController {
    private final GetTodosUseCaseHandler getTodosUseCaseHandler;

    @GetMapping("all")
    public ResponseEntity<List<TodoResponseDto>> getAllTodos() {
        List<TodoAggregate> todos = getTodosUseCaseHandler.handle();
        return ResponseEntity.ok(TodoMapper.INSTANCE.aggregateListToTodoResponseDtoList(todos));
    }
}

最后使用 WebMvcTest 创建了一个 ControllerTest:

@WebMvcTest(controllers = TodoController.class)
@ContextConfiguration(classes = {MessageSourceConfig.class, TodoController.class},
        initializers = ConfigDataApplicationContextInitializer.class)
class TodoControllerTest {
    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private ObjectMapper objectMapper;

    @MockBean
    private GetTodosUseCaseHandler getTodosUseCaseHandler;

    @MockBean
    private CreateTodoUseCaseHandler createTodoUseCaseHandler;

    private static final Long TODO_ID_1 = 1L;

    @Test
    void getAllTodos_success() throws Exception {
        List<TodoAggregate> results = List.of(createAggregate());

        when(getTodosUseCaseHandler.handle()).thenReturn(results);

        mockMvc.perform(get("/api/v1/todos/all"))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$").isArray())
                .andExpect(jsonPath("$.[0].id", is(TODO_ID_1.intValue())))
                .andExpect(jsonPath("$", hasSize(1)));

        verify(getTodosUseCaseHandler).handle();
    }
}

在测试我的应用程序时,当我尝试访问 messageSource -> basenames 参数无法正常工作。基本名称返回类似

${spring.messages.basename}
有什么建议吗?

spring.messages.basename=messages

${spring.messages.basename}
的扩展输出是
messages
,但它是
${spring.messages.basename}

spring-boot spring-boot-test
1个回答
0
投票

有趣,但

@Value
不适用于这种情况。找到两种不同的解决方案:

解决方案一:(使用环境)

@Configuration
@RequiredArgsConstructor
public class MessageSourceConfig {
    private final Environment environment;

    @Bean
    public ReloadableResourceBundleMessageSource messageSource() { 
        String[] basenames = environment.getProperty("spring.messages.basename", String[].class);
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();

        messageSource.setBasenames(basenames);
        messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());

        return messageSource;
    }
}

解决方案2:(使用

@ConfigurationProperties

@Configuration
@RequiredArgsConstructor
public class MessageSourceConfig {

    @Bean
    @ConfigurationProperties(
        prefix = "spring.messages"
    )
    public MessageSourceProperties sourceProperties() {
        return new MessageSourceProperties();
    }

    @Bean
    public ReloadableResourceBundleMessageSource messageSource(MessageSourceProperties sourceProperties) { 
        String[] basenames = StringUtils.commaDelimitedListToStringArray(StringUtils.trimAllWhitespace(sourceProperties.getBasename()));
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();

        messageSource.setBasenames(basenames);
        messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());

        return messageSource;
    }
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.