我正在使用 Spring security 并希望對我的服務回傳的密碼進行單元測驗。但是,由于這是加密的,我試圖模擬執行此加密的方法,該方法位于從 WebSecurityConfigurerAdapter 擴展的類中。
@Override
public void configure(AuthenticationManagerBuilder auth){
auth.userDetailsService(userDetailsService).passwordEncoder(NoOpPasswordEncoder.getInstance());
}
所以我正在嘗試這樣的事情
@Autowired
AuthenticationManagerBuilder auth;
static class PasswordEncoderTest implements PasswordEncoder {
@Override
public String encode(CharSequence charSequence) {
return charSequence.toString();
}
@Override
public boolean matches(CharSequence charSequence, String s) {
return charSequence.toString().equals(s);
}
}
@Test
void testCreateUser() throws Exception {
UserCreateDto userCreateDto = new UserCreateDto("user", "test", "[email protected]", "[email protected]", "123456", "basic");
User userMocked = new User(userId, "user", "test", "[email protected]", "[email protected]", "123456", "basic");
PasswordEncoderTest passwordEncoderTest = new PasswordEncoderTest();
passwordEncoderTest.encode("123456");
when(auth.userDetailsService(myUserDetailsService).passwordEncoder(NoOpPasswordEncoder.getInstance())).thenReturn(auth.userDetailsService(myUserDetailsService).passwordEncoder(passwordEncoderTest));
userCreateDto = userCommandService.createUser(userCreateDto);
assertEquals(userMocked.getPassword(), userCreateDto.getPassword());
}
但它失敗了 DaoAuthenticationConfigurer cannot be returned by generateToken() generateToken() should return String
不確定該方法是否正確,以及我是否可能做錯了。
謝謝你。
更新
https://github.com/francislainy/adverts-backend/tree/dev_jwt
根據我與 Palx 的對話,我似乎應該注入密碼編碼器而不是 bycript,并且在主類和測驗類之間有不同的配置。將嘗試這樣做并回傳此處進行進一步更新。
uj5u.com熱心網友回復:
它現在正在作業。而不是嘲笑散列,有兩個不同的 beans,一個在下面Configuration,另一個在下面TestConfiguration。用于測驗的 bean 沒有 hashing。
主應用程式的配置:
@Configuration
public class WebConfig {
@Bean public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
測驗配置:
@TestConfiguration
public class TestConfig {
@Bean public PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance() ;
}
}
測驗:
@Import({TestConfig.class})
@WebMvcTest(UserCommandService.class)
class UserCommandServiceTest {
@MockBean
UserRepository userRepository;
@Autowired
private UserCommandService userCommandService;
@MockBean
private MyUserDetailsService myUserDetailsService;
@MockBean
private JwtUtil jwtUtil;
@Test
void testCreateUser() {
User userMocked = new User(userId, "user", "test", "[email protected]", "123456", "[email protected]", "basic");
UserCreateDto userCreateDto = new UserCreateDto("user", "test", "[email protected]", "123456", user@gmail.com", "basic");
when(userRepository.save(any(User.class))).thenReturn(userMocked);
userCreateDto = userCommandService.createUser(userCreateDto);
assertEquals(userMocked.getPassword(), userCreateDto.getPassword());
}
}
PS:不要忘記在類名上方@Import TestConfig 類。
最后是服務類
@Service
public class UserCommandServiceImpl implements UserCommandService {
private final UserRepository userRepository;
@Autowired
private PasswordEncoder passwordEncoder;
public UserCommandServiceImpl(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public UserCreateDto createUser(UserCreateDto userCreateDto) {
User user = new User();
user.setFirstname(userCreateDto.getFirstname());
user.setLastname(userCreateDto.getLastname());
user.setEmail(userCreateDto.getEmail());
user.setUsername(userCreateDto.getUsername());
user.setPassword(userCreateDto.getPassword());
user = userRepository.save(user);
return new UserCreateDto(user.getId(), user.getFirstname(), user.getLastname(), user.getUsername(), passwordEncoder.encode(user.getPassword()), user.getEmail(), user.getRole());
}
}
uj5u.com熱心網友回復:
如果您的意思是集成測驗...我無法真正嘗試,但我認為您可以將其配置PasswordEncoder為 a@Bean然后覆寫 bean 配置以使用非編碼PasswordEncoder.
例如
@Configuration
class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired private PasswordEncoder passwordEncoder;
@Bean public PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance();
}
@Override
public void configure(AuthenticationManagerBuilder auth){
auth.userDetailsService(userDetailsService)
.passwordEncoder(passwordEncoder);
}
}
然后在您的測驗中,您將有一個 bean 定義,例如:
@Bean public PasswordEncoder passwordEncoder() {
return new PasswordEncoderTest();
}
可能會有一些調整,但這就是想法。
請注意,如果使用的唯一原因configure是覆寫協作者,那么您可以洗掉configure塊并定義PasswordEncoder& UserDetailsServicebean。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/379995.html
下一篇:超級子選單不像應該的那樣出現
