亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 JUnit 測試具有 @PreAuthorize 的服務方法

使用 JUnit 測試具有 @PreAuthorize 的服務方法

開心每一天1111 2022-05-25 16:03:03
在 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);    }}這是服務:@Servicepublic 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);    }}測試成功,這是失敗。
查看完整描述

3 回答

?
拉丁的傳說

TA貢獻1789條經驗 獲得超8個贊

用注釋你的測試類


@RunWith(SpringRunner.class)

@ContextConfiguration

你的方法應該是這樣的


@Test(expected = AccessDeniedException.class)

@WithAnonymousUser

@Test

    public void findByIdWithoutAccessRightTest() {

        Study study = studyService.findById(STUDY_ID);

    }

如果不至少加載安全上下文,您將無法測試安全性。


你可能想看看這個例子:


public ApplicationUser getApplicationUser() {

    ApplicationUser applicationUser = (ApplicationUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

    return applicationUser;

}


import org.junit.Before;

import org.junit.Rule;

import org.junit.Test;

import static org.mockito.Mockito.when;

import static org.mockito.Mockito.mock;

import org.mockito.MockitoAnnotations;

import org.springframework.security.core.Authentication;

import org.springframework.security.core.context.SecurityContext;

import org.springframework.security.core.context.SecurityContextHolder;

import com.arpit.security.user.ApplicationUser;


public class BaseTest {


    @Before

    public void setupMock() {

        MockitoAnnotations.initMocks(this);

    }


    @Test

    public void mockApplicationUser() {

        ApplicationUser applicationUser = mock(ApplicationUser.class);

        Authentication authentication = mock(Authentication.class);

        SecurityContext securityContext = mock(SecurityContext.class);

        when(securityContext.getAuthentication()).thenReturn(authentication);

        SecurityContextHolder.setContext(securityContext);

        when(SecurityContextHolder.getContext().getAuthentication().getPrincipal()).thenReturn(applicationUser);

    }


}

取自:https ://www.javacodegeeks.com/2017/05/mocking-spring-security-context-unit-testing.html


而且我想您的服務方法故意有語法錯誤?(缺少括號和錯誤的引號?)


查看完整回答
反對 回復 2022-05-25
?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

這就是我讓它工作的方式:


@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() {

        ...

    }

}

如果你有興趣@WithMockKeycloakUser,問我。


查看完整回答
反對 回復 2022-05-25
?
慕碼人8056858

TA貢獻1803條經驗 獲得超6個贊

如果要測試 Spring Security 注釋,則需要使用SpringRunner它將創建 Spring Context 并將 Spring Security 代碼注入代理類。

如何測試 Spring Security 你可以在這里找到。


查看完整回答
反對 回復 2022-05-25
  • 3 回答
  • 0 關注
  • 247 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號