Skip to content

Commit 531da01

Browse files
committed
Improve MediaTypeAssert to-string-equality assertions
This commit introduces a `isNotEqualTo(String)` assertion in order to avoid false negatives when using the default Object-based assertion. This is a risk since MediaTypeAssert has a `isEqualTo(String)` method that overrides the base object method and parses the provided String into a MediaType. Users may thus be tempted to use the reverse assertion and expect the same parsing behaviour. This commit also adds tests around the String parsing and the isNotEqual cases. Closes gh-32756
1 parent 60c5f44 commit 531da01

File tree

2 files changed

+78
-7
lines changed

2 files changed

+78
-7
lines changed

spring-test/src/main/java/org/springframework/test/http/MediaTypeAssert.java

+16-4
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,21 @@ public MediaTypeAssert(@Nullable MediaType mediaType) {
4949
/**
5050
* Verify that the actual media type is equal to the given string
5151
* representation.
52-
* @param expected the expected media type
52+
* @param mediaType the expected media type, as a String to be parsed
53+
* into a MediaType
54+
*/
55+
public MediaTypeAssert isEqualTo(String mediaType) {
56+
return isEqualTo(parseMediaType(mediaType));
57+
}
58+
59+
/**
60+
* Verify that the actual media type is not equal to the given string
61+
* representation.
62+
* @param mediaType the given media type, as a String to be parsed
63+
* into a MediaType
5364
*/
54-
public MediaTypeAssert isEqualTo(String expected) {
55-
return isEqualTo(parseMediaType(expected));
65+
public MediaTypeAssert isNotEqualTo(String mediaType) {
66+
return isNotEqualTo(parseMediaType(mediaType));
5667
}
5768

5869
/**
@@ -84,7 +95,8 @@ public MediaTypeAssert isCompatibleWith(MediaType mediaType) {
8495
* // Check that actual is compatible with "text/plain"
8596
* assertThat(mediaType).isCompatibleWith("text/plain");
8697
* </code></pre>
87-
* @param mediaType the media type with which to compare
98+
* @param mediaType the media type with which to compare, as a String
99+
* to be parsed into a MediaType
88100
*/
89101
public MediaTypeAssert isCompatibleWith(String mediaType) {
90102
return isCompatibleWith(parseMediaType(mediaType));

spring-test/src/test/java/org/springframework/test/http/MediaTypeAssertTests.java

+62-3
Original file line numberDiff line numberDiff line change
@@ -43,19 +43,35 @@ void actualStringCanBeNull() {
4343
}
4444

4545
@Test
46-
void isEqualWhenSameShouldPass() {
46+
void isEqualWhenActualIsNullStringShouldFail() {
47+
assertThatExceptionOfType(AssertionError.class)
48+
.isThrownBy(() -> assertThat(null).isEqualTo("text/html"))
49+
.withMessageContaining("Media type");
50+
}
51+
52+
@Test
53+
void isEqualWhenSameStringShouldPass() {
4754
assertThat(mediaType("application/json")).isEqualTo("application/json");
4855
}
4956

5057
@Test
51-
void isEqualWhenDifferentShouldFail() {
58+
void isEqualWhenDifferentStringShouldFail() {
5259
assertThatExceptionOfType(AssertionError.class)
5360
.isThrownBy(() -> assertThat(mediaType("application/json")).isEqualTo("text/html"))
5461
.withMessageContaining("Media type");
5562
}
5663

5764
@Test
58-
void isEqualWhenActualIsNullShouldFail() {
65+
void isEqualInvalidStringShouldFail() {
66+
assertThatExceptionOfType(AssertionError.class)
67+
.isThrownBy(() -> assertThat(mediaType("application/json")).isEqualTo("example of a bad value"))
68+
.withMessageContaining("[Media type]")
69+
.withMessageEndingWith("To be a valid media type but got:\n" +
70+
" \"Invalid mime type \"example of a bad value\": does not contain '/'\"\n");
71+
}
72+
73+
@Test
74+
void isEqualWhenActualIsNullTypeShouldFail() {
5975
assertThatExceptionOfType(AssertionError.class)
6076
.isThrownBy(() -> assertThat(null).isEqualTo(MediaType.APPLICATION_JSON))
6177
.withMessageContaining("Media type");
@@ -73,6 +89,49 @@ void isEqualWhenDifferentTypeShouldFail() {
7389
.withMessageContaining("Media type");
7490
}
7591

92+
@Test
93+
void isNotEqualWhenActualIsNullStringShouldPass() {
94+
assertThat(null).isNotEqualTo("application/json");
95+
}
96+
97+
@Test
98+
void isNotEqualWhenDifferentStringShouldPass() {
99+
assertThat(mediaType("application/json")).isNotEqualTo("text/html");
100+
}
101+
102+
@Test
103+
void isNotEqualWhenSameStringShouldFail() {
104+
assertThatExceptionOfType(AssertionError.class)
105+
.isThrownBy(() -> assertThat(mediaType("application/json")).isNotEqualTo("application/json"))
106+
.withMessageContaining("Media type");
107+
}
108+
109+
@Test
110+
void isNotEqualInvalidStringShouldFail() {
111+
assertThatExceptionOfType(AssertionError.class)
112+
.isThrownBy(() -> assertThat(mediaType("application/json")).isNotEqualTo("example of a bad value"))
113+
.withMessageContaining("[Media type]")
114+
.withMessageEndingWith("To be a valid media type but got:\n" +
115+
" \"Invalid mime type \"example of a bad value\": does not contain '/'\"\n");
116+
}
117+
118+
@Test
119+
void isNotEqualWhenActualIsNullTypeShouldPass() {
120+
assertThat(null).isNotEqualTo(MediaType.APPLICATION_JSON);
121+
}
122+
123+
@Test
124+
void isNotEqualWhenDifferentTypeShouldPass() {
125+
assertThat(mediaType("application/json")).isNotEqualTo(MediaType.TEXT_HTML);
126+
}
127+
128+
@Test
129+
void isNotEqualWhenSameTypeShouldFail() {
130+
assertThatExceptionOfType(AssertionError.class)
131+
.isThrownBy(() -> assertThat(mediaType("application/json")).isNotEqualTo(MediaType.APPLICATION_JSON))
132+
.withMessageContaining("Media type");
133+
}
134+
76135
@Test
77136
void isCompatibleWhenSameShouldPass() {
78137
assertThat(mediaType("application/json")).isCompatibleWith("application/json");

0 commit comments

Comments
 (0)