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 オブジェクトを構築することができます。しかし、スタックオーバーフロー例外が発生します。なんで?再帰的に呼び出されたコンストラクターは、コンストラクターを呼び出す前にルート オブジェクトに渡されるようになったためです。
要するに、ここで必要なのは、「whenNew(JSONObject.class, times(1))」などと言いたいということです。そのため、最初のコンストラクター呼び出しのみがモックされ、以降はモックされなくなります。これは可能だと思いましたが、これを達成する方法が見つかりません:(
助けてくれてありがとう、みんな!