PowerMock模拟注入身份验证

时间:2019-01-03 10:16:53

标签: unit-testing spring-boot powermock spring-boot-test powermockrunner

我正在Spring Boot应用程序中使用PowerMockRunner进行测试。一切正常,但是当我的控制器动作定义包含someControllerMethod(..., Authentication auth, ...)时。然后auth为null,因此某些代码无法正常工作。

我尝试模拟AuthenticationSecurityContext。出现了这样的情况

    private void mockSecurity() {
        Authentication authentication = mock(Authentication.class);
        SecurityContext securityContext = mock(SecurityContext.class);

        List<SimpleGrantedAuthority> authorities = Arrays.asList(new SimpleGrantedAuthority("USER"));
        User mockedUser = new User("testuser", "passwordtest", authorities);

        when(securityContext.getAuthentication()).thenReturn(authentication);
        SecurityContextHolder.setContext(securityContext);
        when(SecurityContextHolder.getContext().getAuthentication().getDetails()).thenReturn(mockedUser);
        when(SecurityContextHolder.getContext().getAuthentication().getName()).thenReturn(mockedUser.getUsername());
    }

现在,如果我的代码使用SecurityContextHolder.getContext().getAuthentication()访问身份验证的方法,但那些自动注入的方法不起作用(可能是因为创建控制器模拟时尚未对它进行模拟),这些模拟就可以工作了。

有什么想法可以模拟注入的Authentication,因此不需要更改代码吗? spring-security-test@MockWithUser的结果相同。

测试的相关部分如下所示,

@RunWith(PowerMockRunner.class)
public class UserControllerTest {
    @InjectMocks
    UserController userController;

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
        mockMvc = standaloneSetup(userController).build();
    }

    @Test
    public void getUserDetails() {
        mockSecurity();
        mockMvc.perform(...).andExpect(...);
    }
}

根据pvpkiran控制器代码的要求进行编辑

@RequestMapping(...)
public void getDetails(@PathVariable String id, Authentication auth) {
    UserDetails loadedDetails = userService.getUserDetails(id);
    if (!loadedDetails.getUserId().equals(auth.getName())) {
         throw new Exception(...);
    }
    ...
}

0 个答案:

没有答案