我有Spring Security应用程序。我添加了自定义SpringDataUserDetailsService实现UserDetailsService
。自动连线setUserService
。
public class SpringDataUserDetailsService implements UserDetailsService {
private UserService userService;
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userService.findByEmail(username);
if (user == null) {
throw new UsernameNotFoundException(username);
}
return new org.springframework.security.core.userdetails.User(
user.getEmail(),
user.getPassword(),
convertAuthorities(user.getRoles()));
}
private Set<GrantedAuthority> convertAuthorities(Set<Role> userRoles) {
Set<GrantedAuthority> authorities = new HashSet<>();
for (Role ur : userRoles) {
authorities.add(new SimpleGrantedAuthority(ur.getRole()));
}
return authorities;
}
}
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
User findByEmail(String email);
}
@Service
public class UserService {
private static final String DEFAULT_ROLE = "ROLE_USER";
private final UserRepository userRepository;
private final RoleRepository roleRepository;
private final PasswordEncoder passwordEncoder;
public UserService(UserRepository userRepository, RoleRepository roleRepository, PasswordEncoder passwordEncoder) {
this.userRepository = userRepository;
this.roleRepository = roleRepository;
this.passwordEncoder = passwordEncoder;
}
public List<User> getAllUsers() {
return userRepository.findAll();
}
public void registerNewUserAccount(User user) {
if (emailExist(user.getEmail())) {
throw new UserAlreadyExistException("There is an account with that email address: "
+ user.getEmail());
}
// set default role
Role userRole = roleRepository.findRoleByRole(DEFAULT_ROLE);
user.getRoles().add(userRole);
// set hash password
user.setPassword(passwordEncoder.encode(user.getPassword()));
// save
userRepository.save(user);
}
public User findByEmail(String email) {
return userRepository.findByEmail(email);
}
private boolean emailExist(String email) {
return userRepository.findByEmail(email) != null;
}
}
我已经通过浏览器测试过了,它工作正常。我可以注册新用户(到数据库),然后登录到应用程序。现在我想为CustomController
编写测试,但是收到错误。如果我删除AutowungsetUserService
测试通过,但是我不能注册新用户。我需要在哪里找到问题?
在上下文初始化过程中遇到的异常-取消刷新尝试:org.springframework.beans.factory.BeanCreationExctive:创建名为springSecurityFilterChain的bean时出错在类路径资源[org/spring框架/安全/配置/注释/web/配置/WebSecurityConfiguration.class]中定义:通过工厂方法的Bean实例化失败;嵌套异常org.springframework.beans.BeanInstantiationExctive:未能实例化[javax.servlet.过滤器]:工厂方法'springSecurityFilterChain'抛出异常;嵌套异常org.springframework.beans.factory.不满意依赖异常:创建名称为'CustUserDetailsService'的bean时出错:通过方法'setUserService'参数0表示的不满意依赖;嵌套异常org.springframework.beans.factory.NoSuchBean定义异常:没有类型'. service的限定bean。UserService'可用:预计至少有1个bean符合自动配线候选资格。依赖注释:{}
@ExtendWith(SpringExtension.class)
@WebMvcTest(CustomerController.class)
class CustomerControllerTest {
@MockBean
private CustomerService customerService;
@Autowired
private MockMvc mockMvc;
@Autowired
private WebApplicationContext context;
@BeforeEach
public void setup() {
mockMvc = MockMvcBuilders
.webAppContextSetup(context)
.apply(springSecurity())
.build();
}
@WithMockUser(value = "spring")
@Test
void shouldReturnViewWithPrefilledData() throws Exception {
Customer customer = new Customer();
customer.setId(1L);
customer.setCustomerName("customer Name");
when(customerService.getAllCustomers()).thenReturn(List.of(customer));
this.mockMvc.perform(MockMvcRequestBuilders.get("/customer/list"))
.andExpect(status().isOk())
.andExpect(view().name("customer/customer-list"))
.andExpect(MockMvcResultMatchers.model().attributeExists("customers"));
}
}
你应该加上
@Import({UserService.class})
去你的测试班。结果就是
@ExtendWith(SpringExtension.class)
@WebMvcTest(CustomerController.class)
@Import({UserService.class})
class CustomerControllerTest {
您已经用“WebMvcTest”注释了您的类。在这种情况下,spring并没有完全启动它的整个上下文。例如,Bean初始化只针对控制器进行。如果您希望初始化所有内容(因为您很懒,或者因为您的UserService有更多依赖项,需要手动导入),您可以替换
@WebMvcTest(CustomerController.class)
与
@SpringBootTest
然而,这将需要更长的时间来启动unitTest,因为它必须初始化更多的上下文
英文原文:http://emberjs.com/guides/testing/testing-controllers/ 单元测试方案和计算属性与之前单元测试基础中说明的相同,因为Ember.Controller集成自Ember.Object。 针对控制器的单元测试使用ember-qunit框架的moduleFor来做使这一切变得非常简单。 测试控制器操作 下面给出一个PostsController
经过前面一系列中间件的工作,现在请求终于要达到了正确的控制器方法了。本篇文章主要讲 laravel 如何调用控制器方法,并且为控制器方法依赖注入构建参数的过程。 路由控制器的调用 我们前面已经解析过中间件的搜集与排序、pipeline 的原理,接下来就要进行路由的 run 运行函数: protected function runRouteWithinStack(Route $route, Requ
我试图用JUnit5控制台启动器运行一个简单的测试。我试了几个选择,但都不起作用。谁能告诉我哪里出了问题吗? .+--JUnit Jupiter[OK] '--JUnit Vintage[OK] 测试运行在11毫秒后完成[2个容器] [0个容器跳过][2个容器启动] [0个容器中止][2个容器成功] [0个容器失败][0个测试找到] [0个测试跳过][0个测试启动] [0个测试中止][0个测试成功
问题内容: 我正在尝试使用JUnit5控制台启动器运行一个简单的测试。我尝试了几种选择,但是没有用。有人可以告诉我哪里出了问题吗? 给我警告 我试图在目录中运行所有测试,但这似乎找不到测试: 结果是这样的: 。+-JUnit Jupiter [确定] ‘-JUnit Vintage [确定] 11毫秒后测试运行完成[找到2个容器] [跳过0个容器] [0个容器中止] [2个容器成功] [0个容器失
spring-test模块对测试控制器@Controller提供了最原生的支持。详见14.6 "Spring MVC测试框架"一节。
新的Spring靴。 控制器中的API看起来像, 测试用例看起来像, 现在,在运行测试用例(命令1)后,我得到了以下结果 “java.lang.AssertionError:预期状态: 但“命令2”如期成功。 我的问题是, RestController Prefix Path Controller Prefix Path=整个路径。 为了调用API,我们必须遵循上面的格式,但是如果遵循相同的内容,