Java 如何处理UsernameNotFoundException?
我以前使用过一些测试方法的例子,我的一些合作伙伴使用过,他们没有任何问题,但当我在这个项目中使用它们时,它根本不起作用。我的一个搭档看到了这些方法,他也不知道哪里出了问题。 这是我的测试课:Java 如何处理UsernameNotFoundException?,java,unit-testing,testing,Java,Unit Testing,Testing,我以前使用过一些测试方法的例子,我的一些合作伙伴使用过,他们没有任何问题,但当我在这个项目中使用它们时,它根本不起作用。我的一个搭档看到了这些方法,他也不知道哪里出了问题。 这是我的测试课: @Mock UserRepository dataRepository; @Autowired protected UserService userService; private User u; @BeforeEach()
@Mock
UserRepository dataRepository;
@Autowired
protected UserService userService;
private User u;
@BeforeEach()
void setUp() {
u = new User();
u.setId(23L);
u.setUsername("test");
u.setPassword("Pass1234.");
u.setInfo(null);
this.dataRepository.save(u);
}
@Test
void testLoadUserByUsername() throws Exception {
when(dataRepository.findByUsername(anyString())).thenReturn(u);
userService.loadUserByUsername("test");
assertEquals(u, userService.loadUserByUsername(anyString()));
verify(dataRepository).findByUsername(anyString());
}
@Test
void testFindAllUsers() throws Exception {
List<User> user = this.userService.findAllUsers();
Assertions.assertNotNull(user);
}
}
我不知道会是什么,因为我正在搜索同一个名字,我只在上面设置了几行,所以如果你能帮助我,我将不胜感激
UserService类是:
@Autowired
private BCryptPasswordEncoder passw;
@Autowired
private UserRepository userRepository;
@Autowired
private DataRepository dataRepository;
@Override
public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException {
User user = this.userRepository.findByUsername(username);
if (user == null) {
throw new UsernameNotFoundException("User can't be found");
}
return user;
}
public List<User> findAllUsers() {
List<User> l = new ArrayList<User>();
l = (List<User>) this.userRepository.findAll();
return l;
}
public void save(final User u) {
this.userRepository.save(u);
}
非常感谢。问题在于您的
@Mock
。基本上,您是在模拟测试类中的对象,然后假装要模拟UserService
类中的@Autowired
对象。这里缺少的是告诉Spring将模拟对象放入UserService类中的指令。因此,这里是将修复它的升级
您的测试类如下所示:
@Mock
UserRepository dataRepository;
@InjectMocks
@Autowired
protected UserService userService;
private User u;
@BeforeEach()
void setUp() {
u = new User();
u.setId(23L);
u.setUsername("test");
u.setPassword("Pass1234.");
u.setInfo(null);
this.dataRepository.save(u);
MockitoAnnotations.initMocks(this);
}
// Here goes the remaining code as it is...
基本上,我所做的是在需要接收模拟的@Autowired
元素上方添加@InjectMocks
注释。此外,通过MockitoAnnotations.initMocks(this)
我已经初始化了mock
注意:执行this.dataRepository.save的行(u)代码>是无用的。关键是,对模拟对象调用的每个方法都不会执行,因此拥有与否没有区别。唯一有意义的行是when(dataRepository.findByUsername(anyString())。然后返回(u)代码>您在下面看到的
PS.包含@InjectMocks
和MockitoAnnotations
的依赖项如下:
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-all -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.8.4</version>
<scope>test</scope>
</dependency>
org.mockito
莫基托所有
1.8.4
测试
祝你有美好的一天
D您需要调试测试和代码,以找出它引发异常的原因。如果调试后您仍然需要帮助,您的问题将包括UserService
的代码,特别是它的loadUserByUsername()
方法。有关创建一个好的代码示例的更多建议,请参阅。我编辑并添加了该类,感谢u@code,现在是调试代码的时候了<由于某种原因,code>user
为null
。深入挖掘下一层,看看UserRepository.findByUsername()
做了什么,以及为什么它会返回null。您有模拟存储库对象,并且在每个方法之前对其调用save,您的假设是将对象保存在db中,服务将能够加载它,但不会。您从存储库获取null,因此,if条件通过抛出exception.findByUsername找到具有我给它的用户名的用户,这就是为什么我不理解它返回null@code\u
@Mock
UserRepository dataRepository;
@InjectMocks
@Autowired
protected UserService userService;
private User u;
@BeforeEach()
void setUp() {
u = new User();
u.setId(23L);
u.setUsername("test");
u.setPassword("Pass1234.");
u.setInfo(null);
this.dataRepository.save(u);
MockitoAnnotations.initMocks(this);
}
// Here goes the remaining code as it is...
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-all -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.8.4</version>
<scope>test</scope>
</dependency>