使用 JUnit 测试具有 @PreAuthorize 的服务方法

Jul*_*ien 5 java junit spring spring-security spring-boot

在 Spring Boot 1.4.1 中,我想对使用 @PreAuthorize 限制访问的服务方法进行单元测试(而不是集成测试)。

问题是从 Eclipse 启动单独测试时似乎没有检查 @PreAuthorize(尚未尝试使用 mvn 测试)。

然后,如果我奇迹般地设法正确运行测试,我将尝试使用 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是服务:

@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);
    }

}
Run Code Online (Sandbox Code Playgroud)

测试成功,结果失败。

Jul*_*ien -1

这就是我让它发挥作用的方式:

@RunWith(SpringRunner.class)
@SpringBootTest
@EnableGlobalMethodSecurity(prePostEnabled = true)
@ActiveProfiles("test")
public class StudySecurityTest {

    @Autowired
    private StudyService service;

    @MockBean
    private StudyRepository repository;

    @Test
    @WithAnonymousUser
    public void testAsAnonymous() {
        ...
    }

    @Test
    @WithMockKeycloakUser(id = LOGGED_USER_ID, username = LOGGED_USER_USERNAME, authorities = { "ROLE_USER" })
    public void testAsUser() {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您对此感兴趣@WithMockKeycloakUser,请询问我。