繁体   English   中英

我收到错误,例如在 Mockito 中检测到未完成的存根,我将 Mockito 用于 mocking

[英]Iam getting Error like Unfinished Stubbing Detected in Mockito , Iam using Mockito for mocking

运行测试时出现以下异常。 我将 Mockito 用于 mocking。 Mockito 库提到的提示没有帮助。

E.g. thenReturn() may be missing.
Examples of correct stubbing:
    when(mock.isOk()).thenReturn(true);
    when(mock.isOk()).thenThrow(exception);
    doThrow(exception).when(mock).someVoidMethod();
Hints:
 1. missing thenReturn()
 2. you are trying to stub a final method, you naughty developer!

这是我的方法:从ps.setString我无法进行代码覆盖。 谁能帮我?


public class Dao{
    public int[][] batchInsertAll(Collection<UploadRequest> request, int batchSize, final String jobId) {
    
        int[][] updateAllCounts = jdbcTemplate.batchUpdate("insert into tb_import(id,name) values("","")", request, batchSize,
                new ParameterizedPreparedStatementSetter<UploadRequest>() {
                    public void setValues(PreparedStatement ps, UploadRequest argument) throws SQLException {
                        ps.setString(1, Id);
                       ps.setString(2, argument.getName());
        }}); return updateAllCounts
    }
}

这是我的测试代码:

@Test
public void batchInsertAll() {
    int batchSize = 1000;
    String jobId = "xyz";
    List<UploadRequest> fileData = new ArrayList<UploadRequest>();
    UploadRequest rowdata1 = new UploadRequest("1", "xyz");
    UploadRequest rowdata1 = new UploadRequest("1", "abc");
    fileData.add(rowdata1);
    fileData.add(rowdata2);
    int[][] updateAllCounts = new int[][] { { 1, 2 }, { 3, 4 } };
    try {

        Mockito.doAnswer(new Answer() {
            public Object answer(InvocationOnMock invocation) {
                PreparedStatement ps = Mockito.mock(PreparedStatement.class);
                ParameterizedPreparedStatementSetter bpss = invocation.getArgumentAt(1,
                        ParameterizedPreparedStatementSetter.class);

                try {
                    bpss.setValues(ps, 1);
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return updateAllCounts;

            }
        }).when(jdbcTemplate).batchUpdate(anyString(), fileData, 1000,
                any(ParameterizedPreparedStatementSetter.class));

    } catch (Exception e) {
        assert (true);
    }
    mockDao.batchInsertAll(fileData, 1000, jobId);
}

首先你必须思考——你的目标是什么?

你写了一个 class Dao和一个方法batchInsertAll 我想你会想测试一下。 如果您想测试它,尽管您需要实际调用该方法。 打电话

mockDao.batchInsertAll(fileData, 1000, jobId);

让它看起来,就像你只是调用一个你创建的模拟来测试它,这显然不会做任何事情,除了你配置那个模拟做的任何事情。

此外,使用assert(true)捕获Exception不会做你认为它会做的事情 - 这是一个基本的 Java 断言,用于非生产构建中的健全性检查。 它要么根本不运行(这可能是在没有适当标志来启用它们的情况下运行应用程序时的默认行为)或什么都不做(因为 true 为 true,所以它通过)。 它不会以肯定的结果结束测试,它不会告诉你它发生了,它甚至不算作测试断言。 您可能想在此处添加一些日志记录,因为在不知道您没有预料到的异常情况下会引发任何数量的恶作剧。 或者更好的是,不要在测试中捕获异常。 如果抛出意外异常,您希望测试无论如何都失败,对吗?

至于您的直接问题,如果没有看到整个测试 class 就很难确定(我可以在您的代码中看到三个模拟 - jdbcTemplatemockDaops ,其中只有一个在您给我们的代码中初始化为 Mock ,你只存根jdbcTemplate并且从我可以告诉而不运行它看起来正确的代码)。 问题出在您没有向我们展示的某个地方,或者在jdbcTemplate存根期间引发异常,导致该问题无法完成并失败,从而使模拟无效 state。

另外值得注意的是,您在 doAnswer 方法中的大部分代码都是无关紧要的。 即使您调用真正的batchInsertAll ,它也会使用一些参数调用jdbcTemplate.batchUpdate ,并且您的模拟将返回 updateAllCounts 数组。 仅当您需要根据输入 arguments 更改模拟返回的内容时,doAnswer() 方法行才有用,否则您可能会做一些无用的计算,并最终得到与.thenReturn(updateAllCounts)相同的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM