1

我即将建立一个 JSON 对象并想测试结果。我正在调用公共方法。有几个私有方法并进行了递归调用。一开始我有这个:

JSONObject obj = new JSONObject();

这是我的“根”对象。不幸的是,它不是作为参数等给出的,而是使用构造函数创建的,如图所示。在 recursvie 调用中,此构造函数被多次调用以构建结构。我需要的是测试中断言的根对象。

所以我试图以某种方式得到它并在这里尝试这种方法......以下代码:

JSONObject json = new JSONObject();
PowerMockito.whenNew(JSONObject.class).withNoArguments().thenReturn(json);

[...]

assertThat(json.get("bla"), is("hello")); // assertions possible to my root json object

这将允许我在执行我的断言后拥有构建的根 json 对象。但是我遇到了 stackoverflow 异常。为什么?因为递归调用的构造函数现在通过我的根对象调用构造函数。

所以底线,我在这里需要什么:我想说“whenNew(JSONObject.class,times(1))”或类似的东西。这样只有第一个构造函数调用被嘲笑,而以下不再被嘲笑。我认为这应该是可能的,但找不到实现这一目标的方法:(

感谢您的帮助,伙计们!

4

1 回答 1

2

我遇到过同样的问题。我有一个主 JSONObject 和一些内部 JSONObject,但我只想要第一个,其他的可以照常工作。基本上,您也必须在第一次之后设置实例。

final JSONObject requestJSON = new JSONObject();
final JSONObject innerJSONExample = new JSONObject();
final JSONObject anotherInnerJSONExample = new JSONObject();

PowerMockito.whenNew(JSONObject.class).withNoArguments()
   .thenReturn(requestJSON)      //first return
   .thenReturn(innerJSONExample) //second return
   .thenReturn(anotherInnerJSONExample); //third return and so on...
//I will not use innerJSONExample and the other, but this is needed

值得一提的是,您必须在whenNew之前创建实例。此外,您不能这样做:

PowerMockito.whenNew(JSONObject.class).withNoArguments()
   .thenReturn(requestJSON)      //first return
   .thenReturn(new JSONObject()); //second return

因为您已经设置了当"new JSONObject()"返回"requestJSON"时,所以当你这样做时,你会返回相同的"requestJSON",你可能会得到StackOverflowError

于 2017-07-12T01:49:10.457 回答