diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/Health.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/Health.java index da277125ff..f38645d495 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/Health.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/Health.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,6 +47,7 @@ import org.springframework.util.Assert; * * @author Christian Dupuis * @author Phillip Webb + * @author Michael Pratt * @since 1.1.0 */ @JsonInclude(Include.NON_EMPTY) @@ -229,6 +230,19 @@ public final class Health { return this; } + /** + * Record details from the given {@code details} map. Keys from the given map + * replace any existing keys if there are duplicates. + * @param details map of details + * @return this {@link Builder} instance + * @since 2.1.0 + */ + public Builder withDetails(Map details) { + Assert.notNull(details, "Details must not be null"); + this.details.putAll(details); + return this; + } + /** * Set status to {@link Status#UNKNOWN} status. * @return this {@link Builder} instance diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/HealthTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/HealthTests.java index 70fc98e56a..057703cb3d 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/HealthTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/HealthTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,17 +17,22 @@ package org.springframework.boot.actuate.health; import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.entry; /** * Tests for {@link Health}. * * @author Phillip Webb + * @author Michael Pratt + * @author Stephane Nicoll */ public class HealthTests { @@ -53,7 +58,7 @@ public class HealthTests { Health health = new Health.Builder(Status.UP, Collections.singletonMap("a", "b")) .build(); assertThat(health.getStatus()).isEqualTo(Status.UP); - assertThat(health.getDetails().get("a")).isEqualTo("b"); + assertThat(health.getDetails()).containsOnly(entry("a", "b")); } @Test @@ -76,24 +81,53 @@ public class HealthTests { RuntimeException ex = new RuntimeException("bang"); Health health = new Health.Builder(Status.UP, Collections.singletonMap("a", "b")) .withException(ex).build(); - assertThat(health.getDetails().get("a")).isEqualTo("b"); - assertThat(health.getDetails().get("error")) - .isEqualTo("java.lang.RuntimeException: bang"); + assertThat(health.getDetails()).containsOnly(entry("a", "b"), + entry("error", "java.lang.RuntimeException: bang")); } @Test public void withDetails() { Health health = new Health.Builder(Status.UP, Collections.singletonMap("a", "b")) .withDetail("c", "d").build(); - assertThat(health.getDetails().get("a")).isEqualTo("b"); - assertThat(health.getDetails().get("c")).isEqualTo("d"); + assertThat(health.getDetails()).containsOnly(entry("a", "b"), entry("c", "d")); + } + + @Test + public void withDetailsMap() { + Map details = new LinkedHashMap<>(); + details.put("a", "b"); + details.put("c", "d"); + Health health = Health.up().withDetails(details).build(); + assertThat(health.getDetails()).containsOnly(entry("a", "b"), entry("c", "d")); + } + + @Test + public void withDetailsMapDuplicateKeys() { + Map details = new LinkedHashMap<>(); + details.put("c", "d"); + details.put("a", "e"); + Health health = Health.up().withDetail("a", "b").withDetails(details).build(); + assertThat(health.getDetails()).containsOnly(entry("a", "e"), entry("c", "d")); + } + + @Test + public void withDetailsMultipleMaps() { + Map details1 = new LinkedHashMap<>(); + details1.put("a", "b"); + details1.put("c", "d"); + Map details2 = new LinkedHashMap<>(); + details1.put("a", "e"); + details1.put("1", "2"); + Health health = Health.up().withDetails(details1).withDetails(details2).build(); + assertThat(health.getDetails()).containsOnly(entry("a", "e"), entry("c", "d"), + entry("1", "2")); } @Test public void unknownWithDetails() { Health health = new Health.Builder().unknown().withDetail("a", "b").build(); assertThat(health.getStatus()).isEqualTo(Status.UNKNOWN); - assertThat(health.getDetails().get("a")).isEqualTo("b"); + assertThat(health.getDetails()).containsOnly(entry("a", "b")); } @Test @@ -107,7 +141,7 @@ public class HealthTests { public void upWithDetails() { Health health = new Health.Builder().up().withDetail("a", "b").build(); assertThat(health.getStatus()).isEqualTo(Status.UP); - assertThat(health.getDetails().get("a")).isEqualTo("b"); + assertThat(health.getDetails()).containsOnly(entry("a", "b")); } @Test @@ -122,8 +156,8 @@ public class HealthTests { RuntimeException ex = new RuntimeException("bang"); Health health = Health.down(ex).build(); assertThat(health.getStatus()).isEqualTo(Status.DOWN); - assertThat(health.getDetails().get("error")) - .isEqualTo("java.lang.RuntimeException: bang"); + assertThat(health.getDetails()) + .containsOnly(entry("error", "java.lang.RuntimeException: bang")); } @Test