Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我在Mockito中检测到未完成的存根等错误,我使用Mockito进行模拟_Java_Spring Boot_Unit Testing_Mockito - Fatal编程技术网

Java 我在Mockito中检测到未完成的存根等错误,我使用Mockito进行模拟

Java 我在Mockito中检测到未完成的存根等错误,我使用Mockito进行模拟,java,spring-boot,unit-testing,mockito,Java,Spring Boot,Unit Testing,Mockito,我在运行测试时遇到以下异常。我用Mockito来嘲弄。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

我在运行测试时遇到以下异常。我用Mockito来嘲弄。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
我无法进行代码覆盖。有人能帮我吗


公共类Dao{
public int[][]batchInsertAll(收集请求、int batchSize、最终字符串jobId){
int[][]updatealCounts=jdbcTemplate.batchUpdate(“插入tb_导入(id、名称)值(“,”)”),请求,批大小,
新的参数化PreparedStatementSetter(){
public void setValues(PreparedStatement ps,UploadRequest参数)引发SQLException{
ps.setString(1,Id);
ps.setString(2,argument.getName());
}});返回更新计数
}
}
以下是我的测试代码:

@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);
}
@测试
public void batchInsertAll(){
int batchSize=1000;
字符串jobId=“xyz”;
List fileData=new ArrayList();
UploadRequest rowdata1=新的UploadRequest(“1”,“xyz”);
UploadRequest rowdata1=新的UploadRequest(“1”,“abc”);
fileData.add(rowdata1);
fileData.add(rowdata2);
int[][]updatealCounts=newint[][{{1,2},{3,4};
试一试{
Mockito.doAnswer(新答案(){
公共对象应答(调用锁调用){
PreparedStatement ps=Mockito.mock(PreparedStatement.class);
ParameterizedPreparedStatementSetter bpss=invocation.getArgumentAt(1,
ParameterizedPreparedStatementSetter.class);
试一试{
bpss.设定值(ps,1);
}捕获(SQLE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回updateAllCounts;
}
}).when(jdbcTemplate).batchUpdate(anyString(),fileData,1000,
任何(ParameterizedPreparedStatementSetter.class));
}捕获(例外e){
断言(正确);
}
batchInsertAll(fileData,1000,jobId);
}

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

您编写了一个类
Dao
和一个方法
batchInsertAll
。我想你会想测试一下。如果您想测试它,尽管您需要实际调用该方法。召唤

mockDao.batchInsertAll(fileData, 1000, jobId);
让它看起来就像你只是在调用你创建的一个模拟来测试它,这显然除了做你配置该模拟要做的事情之外什么都不会做

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

至于你的直接问题,在没有看到整个测试课程的情况下很难确定(我可以在你的代码中看到三个Mock-
jdbcTemplate
mockDao
ps
,其中只有一个在你给我们的代码中被初始化为Mock,你只需要存根
jdbcTemplate
,从我不运行代码就可以看出它看起来是正确的)。问题可能出现在您没有向我们展示的地方,或者在对
jdbcTemplate
进行存根期间引发异常,导致该异常未完成并失败,使mock处于无效状态


同样值得注意的是,doAnswer方法中的大多数代码都是无关的。即使调用real
batchInsertAll
,它也会调用
jdbcTemplate.batchUpdate
,并带有一些参数,并且您的模拟将返回updateAllCounts数组。doAnswer()只有当您需要根据输入参数更改模拟返回的内容时,方法行才有用,否则您可能会进行一些无用的计算,结果与
相同。然后返回(updatealcounts)
会。

我们需要知道包含batchInsertAll的类的代码,以便知道如何将模拟的jdbcTemplate放入该方法中,因为它是从外部作用域引用的。添加了包含batchInsertAllI的类的代码后,我看不到您在哪里定义了
PreparedStatemens的任何期望或行为t
mock
ps
。如果
ps
的任何合作者调用它,而您尚未为这些调用定义任何行为,Mockito将向您投诉。我正在捕获sqlException