簡體   English   中英

在Spring中模擬身份驗證:提供程序列表拋出NullPointerException

[英]Mocking authentication in Spring: List of providers throws NullPointerException

我正在嘗試在Java中模擬身份驗證以進行身份​​驗證。 這是我的模擬代碼的測試類:

    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()方法的map.put()行上,當我將“ db”放入時,實際上將提供者管理器設置為null並且在ProviderManager得到了NullPointerException

    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 有什么幫助嗎?

不要模擬ArrayList而是創建新的數組列表,並將其發送到實際的類,如下所示:

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

// when(providers.size())。thenReturn(1); -如果您創建直接arraylist對象,則無需執行此操作。

PS-如果正在使用集合,請不要創建新對象並將該對象發送到實際類,而不是模擬和發送,這是最佳做法。

希望它有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM