Java 我在Mockito中检测到未完成的存根等错误,我使用Mockito进行模拟
我在运行测试时遇到以下异常。我用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
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
mockps
。如果ps
的任何合作者调用它,而您尚未为这些调用定义任何行为,Mockito将向您投诉。我正在捕获sqlException