Java 如何使用Jmockit模拟JdbcTemplate.update?

Java 如何使用Jmockit模拟JdbcTemplate.update?,java,unit-testing,jmockit,jmock,Java,Unit Testing,Jmockit,Jmock,我是Jmockit新手,我正在尝试使用以下验证模拟jdbcTemplate.udpate new Expectations() {{ someRef.flushUpdates(); }}; new Verifications() {{ String query; jdbcTemplate.update(query = withCapture(), withInstanceOf(Date.class)); t

我是Jmockit新手,我正在尝试使用以下验证模拟jdbcTemplate.udpate

    new Expectations() {{
        someRef.flushUpdates();
    }};

    new Verifications() {{
        String query;
        jdbcTemplate.update(query = withCapture(), withInstanceOf(Date.class));
        times = 1;
    }};
flushUpdate有一个更新查询

public void flushUpdates(){
  Date now = new Date();
  String query = "Update table_name set last_updated = ? ";
  jdbcTemplate.update(query,now);
}
该测试验证是否触发了两次更新查询

但我得到了以下错误

mockit.internal.MissingInvocation: Missing 1 invocations to:
org.springframework.jdbc.core.JdbcTemplate#update(String, Object[])
with arguments: any String, an instance of java.util.Date
on mock instance: org.springframework.jdbc.core.JdbcTemplate@2d000e80

有人知道吗

请出示完整的测试代码

无论哪种方式,我认为在这种情况下,您需要做如下操作:

@RunWith(JMockit.class)
public class Test{

    @Tested
    private SomeClass someRef;

    @Injectable
    private JbdcTemplate jdbcTemplate;

    @Test
    public void test(){
        someRef.flushUpdates();

        new Verifications() {{
            String query;
            jdbcTemplate.update(query = withCapture(), withInstanceOf(Date.class));
            times = 1;
        }};
    }

}

如果您不模拟jdbcTemplate,而是将对jdbcTemplate的调用封装在DAO类中,而改为模拟DAO,那么您的工作就会更简单

有一条规则“请勿模仿您不拥有的API”,它适用于任何模仿技术

mockit.internal.MissingInvocation:缺少1个调用,当您的方法参数不匹配时,将引发对的调用。因此,当您使用'any'关键字时,它在调用mock方法时不会查找精确匹配

@Test
        public void test(){
            someRef.flushUpdates();

            new Verifications() {{
                String query;
                jdbcTemplate.update((String)any, (Date)any);
                times = 1;
            }};
        }

快速查看页面。我使用的是@Injectable JdbcTemplate JdbcTemplate;在基类和测试类中,当从期望内部类调用时,该类导致对象引用发生更改。从基类中删除引用解决了这个问题。我不会模仿JdbcTemplate或DAO(如果有的话),但如果您真的想模仿数据库访问,那么这样做本身并没有什么错。请参阅。虽然这可能回答了作者的问题,但它缺少一些解释性词语和文档链接。如果没有一些短语,原始代码片段就没有多大帮助。你也会发现这很有帮助。请编辑您的答案。虽然您的代码可能会更正为答案,但详细说明代码的作用,它可以提高您答案的质量。查看文章:@LuFFy编辑了我的答案。