将Mockito与Lambda表达式一起使用

ih99xse1  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(302)

我有一个使用Spring Security配置的类,我想在它上面写一个单元测试。

@AllArgsConstructor
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    private AuthenticationManager authenticationManager;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests(arc -> arc
                        .antMatchers("/**").authenticated()
                )
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .csrf(AbstractHttpConfigurer::disable)
                .oauth2ResourceServer(rsc ->
                        rsc.opaqueToken(
                                (OAuth2ResourceServerConfigurer<HttpSecurity>.OpaqueTokenConfigurer configurer) ->
                                        configurer.authenticationManager(authenticationManager)
                        )
                );
    }
}

我尝试使用Mockito编写单元测试

@ExtendWith(MockitoExtension.class)
class SecurityConfigurationTest {

    @Mock private HttpSecurity httpSecurity;
    @Mock private SessionManagementConfigurer<HttpSecurity> sessionManagementConfigurer;

    @InjectMocks
    private SecurityConfiguration securityConfiguration;

    @Test
    void testConfigure() throws Exception {
        when(httpSecurity.authorizeRequests(any(Customizer.class))).thenReturn(httpSecurity);
        when(httpSecurity.sessionManagement()).thenReturn(sessionManagementConfigurer);
        when(sessionManagementConfigurer.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .thenReturn(sessionManagementConfigurer);
        when(sessionManagementConfigurer.and()).thenReturn(httpSecurity);
        when(httpSecurity.csrf(any(Customizer.class))).thenReturn(httpSecurity);
        when(httpSecurity.oauth2ResourceServer(any(Customizer.class))).thenReturn(httpSecurity);

        securityConfiguration.configure(httpSecurity);

        verify(httpSecurity, times(1)).authorizeRequests(any(Customizer.class));
        verify(httpSecurity, times(1)).sessionManagement();
        verify(sessionManagementConfigurer, times(1))
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        verify(sessionManagementConfigurer, times(1)).and();
        verify(httpSecurity, times(1)).csrf(any(Customizer.class));
        verify(httpSecurity, times(1)).oauth2ResourceServer(any(Customizer.class));
    }
}

但是,当我运行单元测试时,我发现并没有覆盖所有代码行:

如何获得100%的覆盖率?

cqoc49vn

cqoc49vn1#

你的问题不是关于Lambda表达式!你的问题是你在嘲笑

when(httpSecurity.authorizeRequests(any(Customizer.class))).thenReturn(httpSecurity);

when(httpSecurity.oauth2ResourceServer(any(Customizer.class))).thenReturn(httpSecurity);

这些mock使得类中的代码不会因为被mock而被执行。通过 * 删除 * 这两行,你应该看到你的代码行被覆盖了(或者在开头得到一个错误:))。

相关问题