为了账号安全,请及时绑定邮箱和手机立即绑定

Mockito(Junit)无法遍历 JSONArray 对象

Mockito(Junit)无法遍历 JSONArray 对象

慕神8447489 2022-06-08 17:28:53
我正在尝试为 DataHandler.java 类编写一个单元测试,这反过来又从 SchemaParsor 类调用parseDebeziumSchema方法。此方法将字符串转换为 JSONArray,但是当我尝试使用when(schemaParsor.parseDebeziumSchema(json)).thenReturn(jsonArray);它来模拟它时,会抛出java.lang.NoSuchMethodError: org.json.JSONArray.iterator()Ljava/util/Iterator异常。完整的堆栈跟踪如下,我还附上了DataHandler 类、DataHandlerTest 类和parseDebeziumSchema 方法代码:java.lang.NoSuchMethodError: org.json.JSONArray.iterator()Ljava/util/Iterator;at com.xoom.transformer.dbschemahandler.SchemaParsor.parseDebeziumSchema(SchemaParsor.java:43)at com.xoom.transformer.utils.DataHandlerTest.testdataProcessor(DataHandlerTest.java:52)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:566)at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
查看完整描述

1 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

你的测试有两个问题:


调用存根必须在实际交互之前配置。所以只需交换这些行:

dataHandler.dataProcessor(json, topic_name, partition);

when(schemaParsor.parseDebeziumSchema(json)).thenReturn(jsonArray); //stub parseDebeziumSchema

Mockito.verify用于验证与模拟的交互。但是在您的代码中,您正在验证对被测对象的方法调用。您看不到此错误,因为您的代码在第 1 点中断。删除此行:

verify(dataHandler, Mockito.times(1)).dataProcessor(json, topic_name, partition);

总而言之,您的代码应如下所示。我还添加了schemaParsor.parseDebeziumSchema(json)仅调用一次的验证


@Test

public void testdataProcessor() throws JsonParseException, JSONException {

    jsonObject.put("field","recipe_name");

    jsonObject.put("type","string");

    jsonArray.put(jsonObject);

    when(schemaParsor.parseDebeziumSchema(json)).thenReturn(jsonArray); //stub parseDebeziumSchema


    dataHandler.dataProcessor(json, topic_name, partition);


    verify(schemaParsor, times(1)).parseDebeziumSchema(json); //verify that parseDebeziumSchema is called exactly once

}


查看完整回答
反对 回复 2022-06-08
  • 1 回答
  • 0 关注
  • 130 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信