Further improve thread safety for attributes in DefaultTestContext
Issue: SPR-5863
This commit is contained in:
parent
5755b67325
commit
fbfad8695e
|
@ -41,7 +41,7 @@ public class DefaultTestContext implements TestContext {
|
||||||
|
|
||||||
private static final long serialVersionUID = -5827157174866681233L;
|
private static final long serialVersionUID = -5827157174866681233L;
|
||||||
|
|
||||||
private final Map<String, Object> attributes = new ConcurrentHashMap<>(0);
|
private final Map<String, Object> attributes = new ConcurrentHashMap<>(4);
|
||||||
|
|
||||||
private final CacheAwareContextLoaderDelegate cacheAwareContextLoaderDelegate;
|
private final CacheAwareContextLoaderDelegate cacheAwareContextLoaderDelegate;
|
||||||
|
|
||||||
|
@ -58,15 +58,17 @@ public class DefaultTestContext implements TestContext {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <em>Copy constructor</em> for creating a new {@code DefaultTestContext}
|
* <em>Copy constructor</em> for creating a new {@code DefaultTestContext}
|
||||||
* based on the immutable state and <em>attributes</em> of the supplied context.
|
* based on the <em>attributes</em> and immutable state of the supplied context.
|
||||||
*
|
* <p><em>Immutable state</em> includes all arguments supplied to the
|
||||||
* <p><em>Immutable state</em> includes all arguments supplied to
|
* {@linkplain #DefaultTestContext(Class, MergedContextConfiguration,
|
||||||
* {@link #DefaultTestContext(Class, MergedContextConfiguration, CacheAwareContextLoaderDelegate)}.
|
* CacheAwareContextLoaderDelegate) standard constructor}.
|
||||||
|
* @throws NullPointerException if the supplied {@code DefaultTestContext}
|
||||||
|
* is {@code null}
|
||||||
*/
|
*/
|
||||||
public DefaultTestContext(DefaultTestContext testContext) {
|
public DefaultTestContext(DefaultTestContext testContext) {
|
||||||
this(testContext.testClass, testContext.mergedContextConfiguration,
|
this(testContext.testClass, testContext.mergedContextConfiguration,
|
||||||
testContext.cacheAwareContextLoaderDelegate);
|
testContext.cacheAwareContextLoaderDelegate);
|
||||||
testContext.attributes.forEach(this.attributes::put);
|
this.attributes.putAll(testContext.attributes);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -144,11 +146,13 @@ public class DefaultTestContext implements TestContext {
|
||||||
@Override
|
@Override
|
||||||
public void setAttribute(String name, Object value) {
|
public void setAttribute(String name, Object value) {
|
||||||
Assert.notNull(name, "Name must not be null");
|
Assert.notNull(name, "Name must not be null");
|
||||||
if (value != null) {
|
synchronized (this.attributes) {
|
||||||
this.attributes.put(name, value);
|
if (value != null) {
|
||||||
}
|
this.attributes.put(name, value);
|
||||||
else {
|
}
|
||||||
removeAttribute(name);
|
else {
|
||||||
|
this.attributes.remove(name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,7 +176,9 @@ public class DefaultTestContext implements TestContext {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String[] attributeNames() {
|
public String[] attributeNames() {
|
||||||
return this.attributes.keySet().stream().toArray(String[]::new);
|
synchronized (this.attributes) {
|
||||||
|
return this.attributes.keySet().stream().toArray(String[]::new);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue