当前位置: 首页 > 知识库问答 >
问题:

Spring@配置在测试上下文中未重写

赫连泰宁
2023-03-14

今天,我将我的项目从Spring Boot1.5.9更新到2.1.1,我的一些测试停止工作。当我开始测试时,控制台会弹出错误:

com.example.rest.config.SecurityConfig中的authEntryPoint字段需要一个类型为“com.example.rest.service.auth.EntryPoints.AuthenticationEntryPoint”的bean。

问题是我在SecurityConfig类中定义了这种类型的bean,但我在TestApplication类中的测试包中重写了这个配置。安全配置被定义为静态内部类。我尝试了不同的方法,包括Spring概要文件和@primary注释,但似乎没有任何效果,Spring也不像以前那样选择我的测试配置。唯一起作用的是,当我删除SecurityConfig类的非测试版本时,测试版本变成了该类型的唯一bean。

有人能告诉我如何重写这个原始配置,或者如何关闭Spring Security以进行测试吗?或者也许有一种方法可以迫使Spring不要接收那个非test@configuration bean?

SecurityConfig.Class

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {

        @Autowired
        AuthenticationEntryPoint authEntryPoint;

        @Autowired
        BasicAuthenticationProvider basicAuthProvider;

        @Autowired
        PreAuthenticatedUserDetailsService preAuthUserDetailsService;

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                    .antMatchers("/rest/query/id/*/user/*",
                            "/rest/files/**/*").hasAnyRole("CLIENT", "SYSTEM")
                    .antMatchers("/public/api/management/**/*").hasRole("SYSTEM")
                    .antMatchers("/public/api/**/*").hasAnyRole("SYSTEM", "USER")
                    .antMatchers("/rest/**/*").hasRole("SYSTEM")
                    .and()
                .x509()
                    .userDetailsService(preAuthUserDetailsService)
                    .and()
                .httpBasic()
                    .authenticationEntryPoint(authEntryPoint)
                    .and()
                .sessionManagement()
                    .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                    .and().csrf().disable();
        }

        @Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {       
            auth.authenticationProvider(basicAuthProvider);     
        }

        @Override
        public void configure(WebSecurity web) throws Exception {
            web.ignoring().antMatchers("/").antMatchers("/rest/files/name/**");
        }
    }
@Configuration
@EnableWebSecurity
public static class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/**").permitAll()
        .and().csrf().disable();
    }
}

套件中的示例测试

@RunWith(SpringRunner.class)
@WebMvcTest(DocumentManagementController.class)
public class DocumentManagementControllerTests {

    @Autowired
    MockMvc mvc;

    @MockBean
    SystemMetadataService systemMetadataService;

    @MockBean
    CustomMetadataService customMetadataService;

    @MockBean
    PrinterService printerService;

    @MockBean
    EventLoggerService eventLoggerService;

    @Captor ArgumentCaptor<String> systemCaptor;
    @Captor ArgumentCaptor<String> clientCaptor;
    @Captor ArgumentCaptor<Boolean> holdCaptor;
    @Captor ArgumentCaptor<String> retentionCaptor;
    @Captor ArgumentCaptor<String> objectPathCaptor;
    @Captor ArgumentCaptor<Boolean> accessCaptor;
    @Captor ArgumentCaptor<Boolean> manualProcessingCaptor;
    @Captor ArgumentCaptor<Boolean> incorrectCaptor;
    @Captor ArgumentCaptor<Integer> statusCaptor;
    @Captor ArgumentCaptor<Boolean> noTemplateCaptor;

    @Test
    public void setDocumentAccess_givenProperData_shouldReturnOk() throws Exception {
        when(customMetadataService.setDocumentAccess(anyString(), anyBoolean()))
        .then(inv -> new HcpCreateObjectResult(inv.getArgument(0)));

        Boolean accessForbidden = true; String objectPath = "path";

        mvc.perform(get("/rest/management/access/forbid/"+accessForbidden+"?objectPath="+objectPath))
        .andExpect(status().isOk());

        verify(customMetadataService).setDocumentAccess(objectPathCaptor.capture(), accessCaptor.capture());
        assertThat(objectPathCaptor.getValue(), is(equalTo(objectPath)));
        assertThat(accessCaptor.getValue(), is(equalTo(accessForbidden)));
    }

共有1个答案

易雅畅
2023-03-14

我设法使用@profile@activeprofiles实现了这一功能。但是我必须将我的静态内部@configuration类提取到另一个java文件中,然后它自动地开始工作。仍然没有找到为什么它在Spring Boot的早期版本中起作用

 类似资料:
  • 我有一个Maven项目,它使用Java配置的Spring(等)。引用的属性存储在不同的位置,例如Tomcat的context.xml。 为了进行测试,我创建了一个.properties文件,为组件和服务提供一些值。在我的JUnit测试(使用spring测试上下文)中,这个.properties文件是通过添加的。问题是不会从文件中加载值,而是将值标识符设置为值,例如,(因此我得到了除字符串以外的任何

  • 运行一个maven测试,两个测试都通过了。 这是我的代码: 非常感谢你的帮助

  • 问题内容: 我有一堆JUnit测试用例(集成测试),它们在逻辑上分为不同的测试类。 我们能够为每个测试类加载一次Spring应用程序上下文,然后将其重新用于JUnit测试类中的所有测试用例 但是,我们只是想知道是否有一种方法可以对一堆JUnit测试类仅加载一次Spring应用程序上下文。 FWIW,我们使用Spring 3.0.5,JUnit 4.5并使用Maven构建项目。 问题答案: 是的,这

  • 我使用Spring Boot 2.1.2. RELEASE编写联调,无法设置所需的上下文路径。它总是等于空字符串(用servletContext.getContextPath()获得)。 application-test.properties: 测试配置: 呼叫代码: 应用测试中的其他属性。按预期注入属性。上下文路径通常在我运行服务器时设置。我试图以@SpringBootTest的形式启动这个测试

  • 我们有一个基于Spring的JUnit测试类,它利用一个内部测试上下文配置类 最近,服务类中引入了新的功能,相关测试应添加到ServiceTest中。但是,这也需要创建不同的测试上下文配置类(现有配置类的内部结构相当复杂,如果可能的话,将其更改为既服务于旧测试又服务于新测试似乎非常困难) 有没有一种方法可以实现一个测试类中的某些测试方法将使用一个配置类,而其他方法将使用另一个?似乎只适用于类级别,

  • 所有测试返回“NosuchBeanDefinitionException:没有'com.example.networkService'类型的合格bean可用:预期至少有1个bean符合autowire候选。依赖项注释:{@org.springframework.beans.factory.annotation.autowired(required=true)}” 这是配置文件application