Spring mvc @测试期间@component筛选器内的值不可见
我创建了用于记录和保存所有请求的筛选器,这是其中的一部分:Spring mvc @测试期间@component筛选器内的值不可见,spring-mvc,spring-boot,mockito,Spring Mvc,Spring Boot,Mockito,我创建了用于记录和保存所有请求的筛选器,这是其中的一部分: @Component public class RequestFilter extends OncePerRequestFilter { @Value("${app.endpoint}") private String requestMapping; private final RequestRepository requestRepository;
@Component
public class RequestFilter extends OncePerRequestFilter {
@Value("${app.endpoint}")
private String requestMapping;
private final RequestRepository requestRepository;
@Autowired
public RequestFilter(RequestRepository requestRepository) {
this.requestRepository = requestRepository;
}
....
}
当应用程序运行时,从spring上下文正确读取requestMapping,但是
当我为该筛选器创建测试时,requestMapping为null
@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
有人知道问题出在哪里吗?为什么这在测试中不起作用?正如M.Deinum指出的,问题在于您正在创建RequestFilter的实例,如果您希望Spring在其中注入components@Autowired或propoerties@Value,您必须让Spring按如下方式处理实例化:
@....
public class FilterTest {
....
@Autowired
RequestFilter requestFilter;
@Before
public void setup() {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
.addFilter(requestFilter)
.build();
}
}
它工作起来就像它应该工作一样。您正在自己创建过滤器的新实例,而不是让Spring管理过滤器。