### Question:
JsonUtil { public static Optional<String> getString(final ObjectNode node, final String key) { return getValue(node, key) .filter(jsonNode -> validateType(jsonNode, JsonNodeType.STRING)) .map(JsonNode::asText); }  static ObjectNode normalizeKeys(final ObjectNode objectNode); static Optional<String> getValueAsString(final ObjectNode node, final String key); static String getValueAsString(
      final ObjectNode node, final String key, final String defaultValue); static Optional<String> getString(final ObjectNode node, final String key); static String getString(
      final ObjectNode node, final String key, final String defaultValue); static OptionalInt getInt(final ObjectNode node, final String key); static int getInt(final ObjectNode node, final String key, final int defaultValue); static OptionalLong getLong(final ObjectNode json, final String key); static long getLong(final ObjectNode json, final String key, final long defaultValue); static Optional<Boolean> getBoolean(final ObjectNode node, final String key); static boolean getBoolean(
      final ObjectNode node, final String key, final boolean defaultValue); static ObjectNode createEmptyObjectNode(); static ObjectNode objectNodeFromMap(final Map<String, Object> map); static ObjectNode objectNodeFromString(final String jsonData); static ObjectNode objectNodeFromString(
      final String jsonData, final boolean allowComments); static String getJson(final Object objectNode); static String getJson(final Object objectNode, final boolean prettyPrint); static ObjectMapper getObjectMapper(); static Optional<ObjectNode> getObjectNode(final ObjectNode json, final String fieldKey); static Optional<ObjectNode> getObjectNode(
      final ObjectNode json, final String fieldKey, final boolean strict); static Optional<ArrayNode> getArrayNode(final ObjectNode json, final String fieldKey); static Optional<ArrayNode> getArrayNode(
      final ObjectNode json, final String fieldKey, final boolean strict);  }### Answer:
@Test public void getString_nonExistentKey() { final ObjectNode node = mapper.createObjectNode(); final Optional<String> result = JsonUtil.getString(node, "test"); assertThat(result).isEmpty(); }
@Test public void getString_nullValue() { final ObjectNode node = mapper.createObjectNode(); node.set("test", null); final Optional<String> result = JsonUtil.getString(node, "test"); assertThat(result).isEmpty(); }
@Test public void getString_validValue() { final ObjectNode node = mapper.createObjectNode(); node.put("test", "bla"); final Optional<String> result = JsonUtil.getString(node, "test"); assertThat(result).hasValue("bla"); }
@Test public void getString_nullValue_withDefault() { final String defaultValue = "bla"; final ObjectNode node = mapper.createObjectNode(); node.set("test", null); final String result = JsonUtil.getString(node, "test", defaultValue); assertThat(result).isEqualTo(defaultValue); }
@Test public void getString_nonExistentKey_withDefault() { final String defaultValue = "bla"; final ObjectNode node = mapper.createObjectNode(); final String result = JsonUtil.getString(node, "test", defaultValue); assertThat(result).isEqualTo(defaultValue); }
@Test public void getString_validValue_withDefault() { final ObjectNode node = mapper.createObjectNode(); node.put("test", "bla"); final String result = JsonUtil.getString(node, "test", "11"); assertThat(result).isEqualTo("bla"); }