You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@beam.apache.org by "Kirill Kozlov (Jira)" <ji...@apache.org> on 2019/12/26 19:18:00 UTC
[jira] [Commented] (BEAM-9000) Java Test Assertions without
toString for GenericJson subclasses
[ https://issues.apache.org/jira/browse/BEAM-9000?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17003733#comment-17003733 ]
Kirill Kozlov commented on BEAM-9000:
-------------------------------------
I believe that the following PR [1] is somewhat relevant to this, so I decided to link it here just in case.
[1] [https://github.com/apache/beam/pull/10094]
CC: [~bhulette]
> Java Test Assertions without toString for GenericJson subclasses
> ----------------------------------------------------------------
>
> Key: BEAM-9000
> URL: https://issues.apache.org/jira/browse/BEAM-9000
> Project: Beam
> Issue Type: Improvement
> Components: testing
> Reporter: Tomo Suzuki
> Assignee: Tomo Suzuki
> Priority: Minor
> Fix For: 2.19.0
>
> Time Spent: 2h
> Remaining Estimate: 0h
>
> As of now, there are many tests that assert on {{toString()}} of objects.
> {code:java}
> CounterUpdate result = testObject.transform(monitoringInfo);
> assertEquals(
> "{cumulative=true, integer={highBits=0, lowBits=0}, "
> + "nameAndKind={kind=SUM, "
> + "name=transformedValue-ElementCount}}",
> result.toString());
> {code}
> This style is prone to unnecessary maintenance of the test code when upgrading dependencies. Dependencies may change the internal ordering of fields and trivial change in {{toString()}}. In BEAM-8695, where I tried to upgrade google-http-client, there are ~30 comparison failure due to this {{toString}} assertions.
> They are subclasses of {{com.google.api.client.json.GenericJson}}.
> Several options to enhance these assertions.
> h1. Option 1: Assertion using Map
> Leveraging the fact that GenericJson is a subclass of AbstractMap<String, Object>, the assertion can be written as
> {code:java}
> ImmutableMap<String, Object> expected = ImmutableMap.of("cumulative", true,
> "integer", ImmutableMap.of("highBits", 0, "lowBits", 0),
> "nameAndKind", ImmutableMap.of("kind", "SUM", "name", "transformedValue-ElementCount"));
> assertEquals(expected, (Map<String, Object>)result);
> {code}
> Credit: Ben Whitehead.
> h1. Option 2: Create assertEqualsOnJson
> Leveraging the fact that instance of GenericJson can be instantiated through JSON, the assertion can be written as
> {code:java}
> assertEqualsOnJson(
> "{\"cumulative\":true, \"integer\":{\"highBits\":0, \"lowBits\":0}, "
> + "\"nameAndKind\":{\"kind\":\"SUM\", "
> + "\"name\":\"transformedValue-ElementCount\"}}",
> result);
> {code}
>
> {{assertEqualsOnJson}} is implemented as below. The following field and methods should go to shared test utility class (sdks/testing?)
> {code:java}
> private static final JacksonFactory jacksonFactory = JacksonFactory.getDefaultInstance();
> public static <T extends GenericJson> void assertEqualsOnJson(String expectedJsonText, T actual) {
> CounterUpdate expected = parse(expectedJsonText, CounterUpdate.class);
> assertEquals(expected, actual);
> }
> public static <T extends GenericJson> T parse(String text, Class<T> clazz) {
> try {
> JsonParser parser = jacksonFactory.createJsonParser(text);
> return parser.parse(clazz);
> } catch (IOException ex) {
> throw new IllegalArgumentException("Could not parse the text as " + clazz, ex);
> }
> }
> {code}
> A feature request to handle escaping double quotes via JacksonFactory: [https://github.com/googleapis/google-http-java-client/issues/923]
>
> h1. Option3: Check JSON equality via JSONassert
> * https://github.com/skyscreamer/JSONassert
> * https://github.com/hertzsprung/hamcrest-json (Not using as last commit was in 2012)
> The JSONassert example does not carry quoted double quote characters. The implementation would be converting actual object into JSON object and calling {{JSONAssert.assertEqual}}.
> Credit: Luke Cwik
>
--
This message was sent by Atlassian Jira
(v8.3.4#803005)