ソースを参照

Add unit tests for setUserDetailsMapper method

Signed-off-by: dae won <eodnjs01477@gmail.com>
dae won 6 ヶ月 前
コミット
cb07031259

+ 11 - 0
core/src/main/java/org/springframework/security/provisioning/JdbcUserDetailsManager.java

@@ -166,6 +166,17 @@ public class JdbcUserDetailsManager extends JdbcDaoImpl implements UserDetailsMa
 		setDataSource(dataSource);
 	}
 
+	/**
+	 * Sets the {@code RowMapper} to convert each user result row into a
+	 * {@link UserDetails} object.
+	 *
+	 * The default mapper expects columns with names like 'username', 'password',
+	 * 'enabled', etc., and maps them directly to the corresponding UserDetails
+	 * properties.
+	 * @param mapper the {@code RowMapper} to use for mapping rows in the database, must
+	 * not be null
+	 * @since 6.5
+	 */
 	public void setUserDetailsMapper(RowMapper<UserDetails> mapper) {
 		Assert.notNull(mapper, "userDetailsMapper cannot be null");
 		this.userDetailsMapper = mapper;

+ 23 - 0
core/src/test/java/org/springframework/security/provisioning/JdbcUserDetailsManagerTests.java

@@ -16,6 +16,7 @@
 
 package org.springframework.security.provisioning;
 
+import java.sql.SQLException;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -28,6 +29,7 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.RowMapper;
 import org.springframework.security.PopulatedDatabase;
 import org.springframework.security.TestDataSource;
 import org.springframework.security.access.AccessDeniedException;
@@ -48,14 +50,17 @@ import org.springframework.security.core.userdetails.UserDetails;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.BDDMockito.given;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 /**
  * Tests for {@link JdbcUserDetailsManager}
  *
  * @author Luke Taylor
+ * @author dae won
  */
 public class JdbcUserDetailsManagerTests {
 
@@ -365,6 +370,24 @@ public class JdbcUserDetailsManagerTests {
 		assertThat(updatedAuth.getCredentials()).isNull();
 	}
 
+	@Test
+	public void setUserDetailsMapperWithNullMapperThrowsException() {
+		assertThatExceptionOfType(IllegalArgumentException.class)
+				.isThrownBy(() -> this.manager.setUserDetailsMapper(null))
+				.withMessage("userDetailsMapper cannot be null");
+	}
+
+	@Test
+	public void setUserDetailsMapperWithMockMapper() throws SQLException {
+		RowMapper<UserDetails> mockMapper = mock(RowMapper.class);
+		when(mockMapper.mapRow(any(), anyInt())).thenReturn(joe);
+		this.manager.setUserDetailsMapper(mockMapper);
+		insertJoe();
+		UserDetails newJoe = this.manager.loadUserByUsername("joe");
+		assertThat(joe).isEqualTo(newJoe);
+		verify(mockMapper).mapRow(any(), anyInt());
+	}
+
 	private Authentication authenticateJoe() {
 		UsernamePasswordAuthenticationToken auth = UsernamePasswordAuthenticationToken.authenticated("joe", "password",
 				joe.getAuthorities());