如何使用JMockit模拟JdbcTemplate.update方法?
验证JdbcTemplate.update()调用的JMockit测试方案
嘿,作为JMockit新手,你的思路已经找对方向了!咱们来把这个验证测试打磨得更完善,确保能准确验证flushUpdates()是否触发了预期的更新查询。
先明确测试核心
你要做的是:调用someRef.flushUpdates()后,验证jdbcTemplate.update()是否以正确的SQL语句和Date类型参数执行了恰好一次。
修正后的完整测试代码
首先,要确保JdbcTemplate被正确Mock,然后执行目标方法,最后验证调用行为:
// 假设someRef是你的被测类实例,jdbcTemplate是它的依赖 @Test public void testFlushUpdatesTriggersJdbcUpdate() { // 1. Mock JdbcTemplate实例 JdbcTemplate jdbcTemplate = new MockUp<JdbcTemplate>() {}.getMockInstance(); // 2. 将mock的jdbcTemplate注入到被测实例someRef中(根据你的依赖注入方式调整,比如构造器/setter) SomeClass someRef = new SomeClass(jdbcTemplate); // 3. 执行被测方法 someRef.flushUpdates(); // 4. 验证JdbcTemplate的调用行为 new Verifications() {{ String capturedQuery; Date capturedDate; jdbcTemplate.update(capturedQuery = withCapture(), capturedDate = withCapture()); times = 1; // 确保只调用一次 // 额外验证SQL语句是否符合预期(可选但推荐) assertEquals("Update table_name set last_updated = ? ", capturedQuery); // 验证日期参数有效(可选,根据需求调整) assertNotNull(capturedDate); }}; }
关键点解释
- Mock JdbcTemplate:必须确保被测类
someRef使用的是Mock的JdbcTemplate实例,这样JMockit才能捕获它的调用行为。如果你的被测类是通过Spring注入的,可以用JMockit的@Injectable注解简化注入:@Test public void testFlushUpdatesTriggersJdbcUpdate(@Injectable JdbcTemplate jdbcTemplate) { SomeClass someRef = new SomeClass(jdbcTemplate); someRef.flushUpdates(); new Verifications() {{ String capturedQuery; jdbcTemplate.update(capturedQuery = withCapture(), withInstanceOf(Date.class)); times = 1; assertEquals("Update table_name set last_updated = ? ", capturedQuery); }}; } - 捕获参数并验证:用
withCapture()可以捕获实际传入的参数,不仅能验证调用次数,还能确认SQL语句和参数类型/值是否正确,让测试更严谨。 - 原代码的小问题:你原来的
Expectations块里调用someRef.flushUpdates();是不对的,Expectations是用来定义Mock方法的预期行为(比如返回值),而实际的被测方法调用应该放在测试方法的主逻辑里,之后再用Verifications验证。
针对你的原代码调整
如果要保留你原来的验证结构,修正后的版本应该是这样:
@Test public void testFlushUpdates() { // 注入Mock的JdbcTemplate到someRef JdbcTemplate mockJdbc = new MockUp<JdbcTemplate>() {}.getMockInstance(); SomeClass someRef = new SomeClass(mockJdbc); // 执行被测方法 someRef.flushUpdates(); // 验证调用 new Verifications() {{ String query; // 捕获SQL并验证参数类型 mockJdbc.update(query = withCapture(), withInstanceOf(Date.class)); times = 1; // 可选:验证SQL内容 assertTrue(query.contains("Update table_name set last_updated = ?")); }}; }
这样就能准确验证flushUpdates()是否触发了预期的jdbcTemplate.update()调用啦!
内容的提问来源于stack exchange,提问作者being_j
相关产品推荐
相关产品推荐

