gpt4 book ai didi

java - Mockito 不使用 @PreAuthorize 和 Spring Boot 进行模拟

转载 作者:行者123 更新时间:2023-11-30 06:11:09 24 4
gpt4 key购买 nike

我对 Spring Security(使用 Spring Boot 1.3.1.RELEASE)和 Mockito 有很大的疑问。

当我使用 @PreAuthorize 时关于方法 doIt()在 SampleService 类上,Mockito 没有模拟方法 getValue() (在 SampleDao 类上声明)在测试期间在 SampleService 中 doItTest() .

结果是:java.lang.AssertionError: expected:<false> but was:<true>

它的发生是因为指令

Mockito.when(dao.getValue()).thenReturn(ctrl);

当我在 SampleService 类的方法 doIt() 中使用 @PreAuthorize 时不起作用。

当我删除 @PreAuthorize 时来自方法 doIt()测试doItTest()工作正常(Mockito 正在 mock getValue() )。

但是当我运行另一个测试时 doItDeniedTest() , 与 @PreAuthorize关于方法 doIt() , 它工作正常因为 @PreAuthorize抛出 AccessDeniedException。

我该如何解决?

谢谢大家。

代码:

@SpringBootApplication
public class AppApplication {

public static void main(String[] args) {
SpringApplication.run(AppApplication.class, args);
}
}

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
private LogoutHandler logoutHandler;

@Autowired
private AuthenticationSuccessHandler authenticationSuccessHandler;

@Autowired
private AccessDeniedHandler accessDeniedHandler;

@Autowired
private AuthenticationFailureHandler authenticationFailureHandler;

@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/public/**").permitAll()
.antMatchers("/error/**").permitAll()
.and()
.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/adm/**").hasAnyRole(Role.ROOT,Role.ADM)
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.successHandler(authenticationSuccessHandler)
.failureHandler(authenticationFailureHandler)
.defaultSuccessUrl("/home",true)
.permitAll()
.and()
.logout()
.logoutSuccessUrl("/login")
.permitAll()
.addLogoutHandler(logoutHandler)
.and()
.exceptionHandling()
.accessDeniedHandler(accessDeniedHandler);

}
}


@Repository
public class SampleDao implements Dao {

@Override
public boolean getValue(){
return true;
}

}

@Service
public class SampleService implements Service{

@Autowired
private Dao dao;

@Override
@PreAuthorize(value="hasRole('USR')")
public boolean doIt(){
return dao.getValue();
}

}

我的测试类是:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {AppApplication.class})
@WebAppConfiguration
public class SampleServiceImplTest {
@Mock
private SampleDaoImpl dao;

@Autowired
@Qualifier("sampleServiceImpl")
@InjectMocks
private SampleService svc;

@Before
public void initMocks(){
MockitoAnnotations.initMocks(this);
}


@Test(expected=AccessDeniedException.class)
@WithMockUser(username="usr",roles={"ROOT"})
public void doItDeniedTest() {
svc.doIt();
}

@Test
@WithMockUser(username="usr",roles={"USR"})
public void doItTest() {

Boolean ctrl = Boolean.FALSE;
Mockito.when(dao.getValue()).thenReturn(ctrl);

Boolean rt = svc.doIt();
assertEquals(ctrl,rt);
}

}

最佳答案

您正在将集成测试与单元测试结合起来。不要那样做。您有两个选择:

  1. 根本不要创建 Spring 上下文,在测试中显式连接类并使用您拥有的类似模拟。这将是单元测试。
  2. 如果你想在集成测试中模拟 spring bean,你需要将它注册到 Spring 上下文中。我写了这个blog post on the topic .

关于java - Mockito 不使用 @PreAuthorize 和 Spring Boot 进行模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34592331/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com