[#4946] Change TestInvocationPublishModelFactory to deterministic implementation #4947
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Issue: The method
createDefaultPublishModel()
inTestInvocationPublishModelFactory
compares JSONs to verify that the default object is properly created. However, since JSONs are unordered collections, when converted to strings the parameter order may not be preserved. This test uses a hard-coded JSON string as the expected correct value, but the test could fail if the parameters from the test object are stringified in a different order than the expected string. For another example of this issue being addressed, see this previous merged PR.This test was flagged via the NonDex tool, which detects potentially unreliable tests due to underlying Java API assumptions. To see the Nondex output for this test, you can run:
Fix: The fix I implemented uses JSONAssert's
assertEquals()
method, using non-strict checking (which ignores parameter ordering). This compares the JSON strings without enforcing parameter ordering, which removes the potentially unreliable nature of these tests. This library is already included within the spring-boot dependency, which is already used in the project, so there's no need to update the pom file. Rerunning Nondex shows a passing result.I believe this is the simplest fix, but it seems someone else has already fixed a similar test in a different way: #4633 using JsonNode trees. If it's better to keep code consistency, I can also implement the same methodology here.
One additional change I had to make was to add the
throws Exception
clause onto the test method signature sinceJSONAssert.assertEquals()
can throw aJSONException
. Please let me know if this is an issue; this clause already exists in the same method in line 48 of TestThreadPoolPublishModelFactory, and the integration tests frommvn clean install -Pit
pass. An alternative would be to use a try-catch block andAssertions.fail()
the test if the exception is thrown.PR Checklist:
[SCB-XXX] Fixes bug in ApproximateQuantiles
, where you replaceSCB-XXX
with the appropriate JIRA issue.mvn clean install -Pit
to make sure basic checks pass. A more thorough check will be performed on your pull request automatically.