【发布时间】:2019-06-22 19:22:37
【问题描述】:
在 Spring Boot 1.4.1 中,我想对使用 @PreAuthorize 访问受限的服务方法进行单元测试(而不是集成测试)。
问题是从 Eclipse 启动单独测试时似乎没有检查 @PreAuthorize(尚未尝试使用 mvn test)。
然后,如果我奇迹般地设法正确运行测试,我将尝试使用 StudyService 接口,而不是 impl。
这是我的测试课:
@RunWith(MockitoJUnitRunner.class)
public class TestMethodSecurity {
private static final Long STUDY_ID = 1L;
@Mock
private StudyRepository studyRepository;
@InjectMocks
private StudyServiceImpl studyService;
@Before
public void setup() {
given(studyRepository.findOne(STUDY_ID)).willReturn(ModelsUtil.createStudy());
}
@Test
public void findByIdWithoutAccessRightTest() {
Study study = studyService.findById(STUDY_ID);
}
}
这是服务:
@Service
public class StudyServiceImpl implements StudyService {
@Autowired
private StudyRepository studyRepository;
@Override
@PreAuthorize("hasAnyRole('DOES NOT EVENT CHECK SYNTAX")
public Study findById(final Long id) {
return studyRepository.findOne(id);
}
}
测试成功,就是失败。
【问题讨论】:
-
您可能想查看
@WithUserDetails。 -
您找到解决方案了吗?我有同样的问题 - @PreAuthorize 没有在测试中检查,端点总是返回 http 200,而它们应该返回 http 403。
-
@user2551317 是的,是@EnableGlobalMethodSecurity(prePostEnabled = true),如果我记得的话,我会在星期一写一个完整的解决方案。
-
@Julien 如果你能写出这个问题的完整解决方案,我将不胜感激,当我添加这个注释时,我得到了 BeanDefinitionOverrideException: Invalid bean definition with name 'metaDataSourceAdvisor'。也许这与其他注释混合在一起。
-
@user2551317 我在下面写了我的解决方案。关于你的错误,我不记得有那个,我检查stackoverflow.com/questions/53834643/…
标签: java spring spring-boot junit spring-security