模拟Spring Security中的身份验证对象

时间:2013-03-20 10:44:56

标签: java spring spring-security mocking testng

现在对于单元测试我需要authenticate方法来假装它正常工作,在我的情况下什么也不做,所以我可以测试方法本身是否做了预期的工作(根据单元测试原则在其他地方测试身份验证,但是需要在该方法中调用authenticate)

这是我的TestNG类,我需要为身份验证创建模拟对象:

package in.hexgen.api.facade;

import javax.annotation.Resource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.Authentication;
import org.testng.annotations.Test;

import com.hexgen.api.facade.security.HexGenPermissionEvaluator;

public class HexGenPermissionEvaluatorTest {
     private static final Logger logger = LoggerFactory.getLogger(HexGenPermissionEvaluatorTest.class);

  Object name="akash";
  Object permission="CREATE_REQUISITION";
  Authentication authentication;

  //@Resource(name = "permissionEval")
  private HexGenPermissionEvaluator permissionEval;

  @Test
  public void hasPermission() {
      //authentication.setAuthenticated(true);

      logger.debug("HexGenPermissionEvaluator Generate - starting ...");
         permissionEval.hasPermission(authentication,name, permission);
      logger.debug("HexGenPermissionEvaluator Generate - completed ...");
  }

}

如何做到这一点。

最好的问候

2 个答案:

答案 0 :(得分:5)

考虑到permissionEval对象使用Mockito(https://code.google.com/p/mockito/)调用authentication.isAuthenticatedFor(name,permission)

import static org.mockito.Mockito.*

...

@Test
public void test(){
    // Given
    Authentication authentication = mock(Authentication.class);
    when(authentication.isAuthenticatedFor(eq(name),eq(permission)).thenReturn(true);

    // When
    permissionEval.hasPermission(authentication,name, permission);

    // Then
    // Do you asserts/verify
}

答案 1 :(得分:1)

您可以在@Test方法之上添加@WithMockUser,如下所示

@Test
@WithMockUser(username = "user1", password = "user1", authorities = {
        "ROLE_ADMIN" })
public void testDeleteUser() throws Exception {
    User currentUser = createUser(1L, new Role(1L, "admin"));
    User userForDelete = createUser(2L, new Role(2L, "user"));
    when(userDaoMock.findByLogin(currentUser.getLogin()))
            .thenReturn(currentUser);
    mockMvc.perform(get("/admin/delete/{id}", userForDelete.getId()))
            .andExpect(status().is3xxRedirection())
            .andExpect(redirectedUrl("/admin"));
}