blob: e0365572001cf20194b95bdc5581064561ed5398 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
package org.junit.internal;
import java.io.Serializable;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.StringDescription;
/**
* This class exists solely to provide a serializable description of a matcher to be serialized as a field in
* {@link AssumptionViolatedException}. Being a {@link Throwable}, it is required to be {@link Serializable}, but most
* implementations of {@link Matcher} are not. This class works around that limitation as
* {@link AssumptionViolatedException} only every uses the description of the {@link Matcher}, while still retaining
* backwards compatibility with classes compiled against its class signature before 4.14 and/or deserialization of
* previously serialized instances.
*/
class SerializableMatcherDescription<T> extends BaseMatcher<T> implements Serializable {
private final String matcherDescription;
private SerializableMatcherDescription(Matcher<T> matcher) {
matcherDescription = StringDescription.asString(matcher);
}
public boolean matches(Object o) {
throw new UnsupportedOperationException("This Matcher implementation only captures the description");
}
public void describeTo(Description description) {
description.appendText(matcherDescription);
}
/**
* Factory method that checks to see if the matcher is already serializable.
* @param matcher the matcher to make serializable
* @return The provided matcher if it is null or already serializable,
* the SerializableMatcherDescription representation of it if it is not.
*/
static <T> Matcher<T> asSerializableMatcher(Matcher<T> matcher) {
if (matcher == null || matcher instanceof Serializable) {
return matcher;
} else {
return new SerializableMatcherDescription<T>(matcher);
}
}
}
|