首页 > 解决方案 > @Value 在测试期间在@component 过滤器中不可见

问题描述

我创建了记录和保存所有请求的过滤器,这是其中的一部分:

    @Component
    public class RequestFilter extends OncePerRequestFilter {

         @Value("${app.endpoint}") 
         private String requestMapping;

        private final RequestRepository requestRepository;

        @Autowired
        public RequestFilter(RequestRepository requestRepository) {
            this.requestRepository = requestRepository;
        }
....
    }

当应用程序运行requestMapping时从spring上下文中正确读取,但是当我为该过滤器创建测试时 requestMapping 为空

@SpringBootTest
@RunWith(SpringRunner.class)
@AutoConfigureTestDatabase(connection = EmbeddedDatabaseConnection.H2)
@ContextConfiguration(classes = {MyApplication.class})
@AutoConfigureMockMvc
@ActiveProfiles("test")
public class FilterTest  {

    @Autowired
    private WebApplicationContext webApplicationContext;

    @Autowired
    private RequestRepository requestRepository;

    @Autowired
    protected MockMvc mockMvc;

    @Before
    public void setup() {

        RequestFilter rpmRequestFilter = new RequestFilter(this.requestRepository);

        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
                .addFilter(invalidVpmRequestFilter)
                .build();
    }

}

当然,在 application-test.properties 我已经配置了这个属性:

app.endpoint=/log/save

有人知道问题出在哪里吗?为什么这在测试中不起作用?

标签: spring-mvcspring-bootmockito

解决方案


正如 M. Deinum 指出的那样,问题在于您正在创建一个实例,RequestFilter如果您希望 Spring 在其中注入组件 ( @Autowired) 或属性 ( @Value),则必须让 Spring 按如下方式处理实例化:

@....
public class FilterTest  {
  ....
  @Autowired
  RequestFilter requestFilter;

  @Before
  public void setup() {
    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
            .addFilter(requestFilter)
            .build();
  }
}

推荐阅读