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
相关产品推荐
相关产品推荐

