[英]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.