You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java登录测试出现AssertionError:预期异常未触发求助

问题根源与解决方案

嘿,我帮你找到了测试失败的核心问题——Mockito的参数匹配没命中,导致你预设的异常抛出逻辑根本没被执行,自然捕获不到预期的DisabledException啦!

具体问题分析

  • 参数完全不匹配:你测试里构造的JwtRequest是("someUser", "somPass"),但mockauthManager.authenticate()时用的是new UsernamePasswordAuthenticationToken("someUsername", "somePassword")——这俩参数完全不一样,Mockito找不到对应的mock调用,就会走默认逻辑(不抛异常),测试当然会断言失败。
  • verify的参数也错了:你最后验证service.loadUserByUsername("some"),但实际传入的用户名是"someUser",就算前面过了,这步也会失败。
  • 第二个测试方法没加throws Exception:虽然DisabledException是RuntimeException,但你的createAuthenticationToken声明了抛出这俩异常,加上会更规范,避免编译警告。

修复后的测试代码

1. 修正BadCredentialsException测试

@Test(expected = BadCredentialsException.class)
public void shouldThrowBadCredentialsExceptionWhenTryToAuthWithBadCredential() throws Exception {
    // 把测试参数抽成变量,避免硬编码不一致
    String testUsername = "someUser";
    String testPassword = "somPass";
    JwtRequest jwtRequest = new JwtRequest(testUsername, testPassword);
    
    // 用any()匹配任意UsernamePasswordAuthenticationToken,确保mock能命中
    when(authManager.authenticate(any(UsernamePasswordAuthenticationToken.class)))
        .thenThrow(new BadCredentialsException("bad credentials"));
    
    controller.createAuthenticationToken(jwtRequest);
    
    // 验证参数改为实际传入的用户名
    verify(service, never()).loadUserByUsername(testUsername);
}

2. 修正DisabledException测试

@Test(expected = DisabledException.class)
public void shouldThrowDisabledExceptionWhenTryToAuthWithDisabledUser() throws Exception {
    String testUsername = "someUser";
    String testPassword = "somPass";
    JwtRequest jwtRequest = new JwtRequest(testUsername, testPassword);
    
    // 用eq()精确匹配和实际调用一致的参数
    when(authManager.authenticate(eq(new UsernamePasswordAuthenticationToken(testUsername, testPassword))))
        .thenThrow(new DisabledException("User_disabled"));
    
    controller.createAuthenticationToken(jwtRequest);
    
    verify(service, never()).loadUserByUsername(testUsername);
}

额外优化建议

如果你想让测试更灵活精准,推荐用JUnit 5的assertThrows替代@Test(expected),既能捕获异常,还能验证异常信息:

@Test
void shouldThrowDisabledExceptionWhenTryToAuthWithDisabledUser() throws Exception {
    String testUsername = "someUser";
    String testPassword = "somPass";
    JwtRequest jwtRequest = new JwtRequest(testUsername, testPassword);
    
    when(authManager.authenticate(any(UsernamePasswordAuthenticationToken.class)))
        .thenThrow(new DisabledException("User disabled"));
    
    // 捕获异常并验证消息
    DisabledException exception = assertThrows(DisabledException.class, 
        () -> controller.createAuthenticationToken(jwtRequest));
    assertEquals("User disabled", exception.getMessage());
    
    verify(service, never()).loadUserByUsername(testUsername);
}

这样修改后,你的mock就能正确触发异常,测试就能通过啦!

内容的提问来源于stack exchange,提问作者snzew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:03:09