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>