如何使用Jmockit模拟JdbcTemplate.update?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Jmockit模拟JdbcTemplate.update?相关的知识,希望对你有一定的参考价值。

我是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);
}

测试是验证update查询是否被触发两次。

但我收到以下错误。

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;
        }};
    }

}
另一答案

mockit.internal.MissingInvocation:当方法参数不匹配时,抛出1次调用:抛出。因此,当您使用“any”关键字时,它不会在调用模拟方法时查找完全匹配。

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

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

如果你不是模拟jdbcTemplate,你可以在DAO类和mock dao中封装对jdbcTemplate的调用,那么你的工作会更简单。

有一条规则不要模拟你不拥有的API(它适用于任何模拟技术)https://github.com/mockito/mockito/wiki/How-to-write-good-tests

以上是关于如何使用Jmockit模拟JdbcTemplate.update?的主要内容,如果未能解决你的问题,请参考以下文章

JMockit 基础:模拟对象、模拟参数、期望

JMockit - 期望 - 匹配包含模拟对象作为参数的方法调用

JMockit 模拟返回 String 而不是提供的 List<String>

用jmockit模拟扩展类的抽象方法

JMockit MockUp 可以模拟 toString() 吗?

在Jmockit停止嘲笑