提交 fbfad869 编写于 作者: S Sam Brannen

Further improve thread safety for attributes in DefaultTestContext

Issue: SPR-5863
上级 5755b673
......@@ -41,7 +41,7 @@ public class DefaultTestContext implements TestContext {
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;
......@@ -58,15 +58,17 @@ public class DefaultTestContext implements TestContext {
/**
* <em>Copy constructor</em> for creating a new {@code DefaultTestContext}
* based on the immutable state and <em>attributes</em> of the supplied context.
*
* <p><em>Immutable state</em> includes all arguments supplied to
* {@link #DefaultTestContext(Class, MergedContextConfiguration, CacheAwareContextLoaderDelegate)}.
* based on the <em>attributes</em> and immutable state of the supplied context.
* <p><em>Immutable state</em> includes all arguments supplied to the
* {@linkplain #DefaultTestContext(Class, MergedContextConfiguration,
* CacheAwareContextLoaderDelegate) standard constructor}.
* @throws NullPointerException if the supplied {@code DefaultTestContext}
* is {@code null}
*/
public DefaultTestContext(DefaultTestContext testContext) {
this(testContext.testClass, testContext.mergedContextConfiguration,
testContext.cacheAwareContextLoaderDelegate);
testContext.attributes.forEach(this.attributes::put);
this.attributes.putAll(testContext.attributes);
}
/**
......@@ -144,11 +146,13 @@ public class DefaultTestContext implements TestContext {
@Override
public void setAttribute(String name, Object value) {
Assert.notNull(name, "Name must not be null");
if (value != null) {
this.attributes.put(name, value);
}
else {
removeAttribute(name);
synchronized (this.attributes) {
if (value != null) {
this.attributes.put(name, value);
}
else {
this.attributes.remove(name);
}
}
}
......@@ -172,7 +176,9 @@ public class DefaultTestContext implements TestContext {
@Override
public String[] attributeNames() {
return this.attributes.keySet().stream().toArray(String[]::new);
synchronized (this.attributes) {
return this.attributes.keySet().stream().toArray(String[]::new);
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册