我有一个使用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%的覆盖率?
1条答案
按热度按时间cqoc49vn1#
你的问题不是关于Lambda表达式!你的问题是你在嘲笑
和
这些mock使得类中的代码不会因为被mock而被执行。通过 * 删除 * 这两行,你应该看到你的代码行被覆盖了(或者在开头得到一个错误:))。