2016-09-28 7 views
0

私は認証のためにJavaで認証を模擬しようとしています。私はmap.put()方法で管理者を置く行に、SpringでのMocking認証:プロバイダのリストが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); 

、私は「デシベル」を入れたときに、それは実際にnullとしてプロバイダマネージャを与え、私が手に:これは、コードをあざけるための私のテストクラスですProviderManagerNullPointerException。私はそのはまだNullPointerExceptionを示すパスプロバイダと私のメインのコードで同じことをテストしてみたにもかかわらず

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

。 (復帰が起こる最後の行)

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

私はここで立ち往生しています、両方のこれらの事を、私は彼らがすべてではありません渡すとき :私は、「LDAP」を入れた場合、代わりにそれは私にここUsernamePasswordAuthenticationFilterNullPointerExceptionを与えますnull。どんな助け?

答えて

0

はモックArrayListのではなく、新しい配列のリストを作成し、以下のように実際のクラスにそれを送信しないでください:。

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

//とき(providers.size())thenReturn(1); - 直接arraylistオブジェクトを作成する場合は、このことをする必要はありません。

PS-コレクションを使って作業している場合は、新しいオブジェクトを作成し、そのオブジェクトを模擬と送信の代わりに実際のクラスに送信することをお勧めします。これがベストプラクティスです。

希望します。

関連する問題