2016-09-28 12 views
0

我想在Java中進行身份驗證進行身份驗證。這是我嘲諷的代碼測試類:在春天模擬身份驗證:提供程序列表拋出NullPointerException

MockitoAnnotations.initMocks(this); 

    mvc = MockMvcBuilders.standaloneSetup(this.controller).build(); 

    final List<AuthenticationProvider> providers = mock(ArrayList.class); 
    final AbstractUserDetailsAuthenticationProvider provider = mock(
      AbstractUserDetailsAuthenticationProvider.class); 
    when(provider.supports(any(Class.class))).thenReturn(false); 
    when(providers.size()).thenReturn(1); 
    session = new MockHttpSession(); 
    when(providers.get(anyInt())).thenReturn(provider); 
    when(request.getSession()).thenReturn(session); 
    when(request.getSession(false)).thenReturn(session); 
    when(providers.iterator()).thenReturn(new Iterator<AuthenticationProvider>() { 
     private int currentIndex = 0; 

     @Override 
     public AuthenticationProvider next() { 

      return providers.get(currentIndex++); 
     } 

     @Override 
     public boolean hasNext() { 
      return currentIndex < providers.size() && providers.get(currentIndex) != null; 
     } 
    }); 
    SingleProviderAuthenticationManager manager = new SingleProviderAuthenticationManager(providers); 
    Map<String, AuthenticationManager> map = new HashMap<String, AuthenticationManager>(); 
    map.put("db", manager); 

    filter.setAuthenticationManagerMap(map); 
    when(request.getMethod()).thenReturn("POST"); 
    when(request.getParameter("username")).thenReturn("admin"); 
    when(request.getParameter("password")).thenReturn("admin"); 

    List<User> users = new ArrayList<User>(); 
    User user = new User(); 
    user.setSourceSystem("db"); 
    users.add(user); 
    when(userService.getUserReferenceByUsername("admin")).thenReturn(users); 
    auth = filter.attemptAuthentication(request, response); 

現在,在這裏我把經理的map.put()方法行了,當我把「DB」,它實際上使供應商經理爲null和我得到的NullPointerExceptionProviderManager

for (AuthenticationProvider provider : getProviders()) { 
     if (!provider.supports(toTest)) { 
      continue; 
     } 

即使我已經與我通過它仍然呈現NullPointerException提供商測試同樣的事情在我的主要代碼。如果我把「LDAP」,而不是它給我的UsernamePasswordAuthenticationFilter這裏NullPointerException: (其中回發生的最後一行)

 password = ""; 
    } 

    username = username.trim(); 

    UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password); 

    // Allow subclasses to set the "details" property 
    setDetails(request, authRequest); 

    return this.getAuthenticationManager().authenticate(authRequest); 
} 

我在這裏卡住了,這兩種東西,當我通過他們是不是在所有null。任何幫助?

回答

0

不要模仿ArrayList的,而不是創造新的數組列表,並將其發送到實際的類象下面這樣:。

final List<AuthenticationProvider> providers = new ArrayList<>(); 
    providers.add("AuthenticationProvider object values"); 

//時(providers.size())thenReturn(1); - 如果您創建直接的數組列表對象,則無需執行此操作。

PS-如果您正在使用集合,則更喜歡創建新對象並將該對象發送給實際類而不是模擬和發送,這是最佳實踐。

希望它有用。

相關問題