如何在没有WebAppConfiguration的集成测试中模拟Spring会话

如何在没有WebAppConfiguration的集成测试中模拟Spring会话,spring,junit,spring-test,Spring,Junit,Spring Test,我需要执行一个依赖于会话bean的集成测试。但是,我不想使用@WepAppConfiguration,因为它太耗时了 现在,我使用SpringRunner和ContextConfiguration来解决bean依赖关系,测试执行得非常快。但是,我需要一些代码来模拟会话bean,我想在不使用@WebAppConfiguration的情况下这样做,因为它非常耗时 测试等级: @RunWith(SpringRunner.class) @ContextConfiguration(class=TestCo

我需要执行一个依赖于会话bean的集成测试。但是,我不想使用@WepAppConfiguration,因为它太耗时了

现在,我使用SpringRunner和ContextConfiguration来解决bean依赖关系,测试执行得非常快。但是,我需要一些代码来模拟会话bean,我想在不使用@WebAppConfiguration的情况下这样做,因为它非常耗时

测试等级:

@RunWith(SpringRunner.class)
@ContextConfiguration(class=TestContextSpringConfig.class)
公共类方法测试{
@自动连线
私人海滩;
}
Spring配置类:

import org.springframework.context.annotation.Bean;
导入org.springframework.context.annotation.ComponentScan;
导入org.springframework.context.annotation.Configuration;
@配置
@组件扫描(“net.foo”)
公共类TestContextSpringConfig{
@豆子
公共配置包配置包(){
返回新的ConfigurationPackages();
}
//如何模拟会话bean?
}
我希望测试执行时不会抛出以下错误:

java.lang.IllegalStateException: No Scope registered for scope name 'session'

我找到了答案。回复是这篇文章和这篇文章的混合体

在这个设置中,我为Junit测试的每个方法启动一个线程范围,模拟一个“会话”范围。我所做的是创建以下配置:

@配置
@组件扫描(“net.foo”)
公共类TestContextSpringConfig{
@豆子
公共配置包配置包(){
返回新的ConfigurationPackages();
}
@豆子
公共customScope配置器customScope(){
CustomScopeConfigurer configurer=新的CustomScopeConfigurer();
Map sessionScope=newhashmap();
put(“session”,newthreadscope());
配置器设置范围(会话范围);
返回配置器;
}
}
以下线程范围:

package net.weg.maestro;
导入org.springframework.beans.factory.ObjectFactory;
导入org.springframework.beans.factory.config.Scope;
导入org.springframework.core.NamedThreadLocal;
导入java.util.HashMap;
导入java.util.Map;
公共类ThreadScope实现作用域{
专用最终线程本地线程范围=
新名称ThreadLocal(ThreadScope.class.getName()){
@凌驾
受保护的映射初始值(){
返回新的HashMap();
}
};
@凌驾
公共对象获取(字符串名称,ObjectFactory ObjectFactory){
Map scope=this.threadScope.get();
Object=scope.get(name);
if(object==null){
object=objectFactory.getObject();
范围.放置(名称、对象);
}
返回对象;
}
@凌驾
公共对象删除(字符串名称){
Map scope=this.threadScope.get();
返回范围。删除(名称);
}
@凌驾
public void registerDestructionCallback(字符串名称,可运行回调){
}
@凌驾
公共对象ResolveContextaObject(字符串键){
返回null;
}
@凌驾
公共字符串getConversationId(){
返回Thread.currentThread().getName();
}
公共空间清除(){
Map scope=this.threadScope.get();
scope.clear();
}
}
单元测试现在可以在沙盒环境(ThreadLocal)中访问会话bean

@RunWith(SpringRunner.class)
@ContextConfiguration(class=TestContextSpringConfig.class)
公共类方法测试{
@自动连线
私有bean会话bean会话;//会话bean
@试验
public void参数reachabilitytest(){
ObjectA ObjectA=新ObjectA();
ObjectB ObjectB=新的ObjectB();
getObjectBList().add(objectB);
objectB.setObjectA(objectA);
setRootState(objectA);//使用会话bean
ObjectBComponent ObjectBComponent=maestro.getComp(objectB,ObjectBComponent.class);
objectBComponent.parameterReachableTest();
assertThat((对象)objectBComponent.getThreadValue(“objectBComponent”)).isNotNull();
assertThat((对象)objectBComponent.getThreadValue(“objectAComponent”)).isNotNull();
}
}

我找到了答案。回复是这篇文章和这篇文章的混合体

在这个设置中,我为Junit测试的每个方法启动一个线程范围,模拟一个“会话”范围。我所做的是创建以下配置:

@配置
@组件扫描(“net.foo”)
公共类TestContextSpringConfig{
@豆子
公共配置包配置包(){
返回新的ConfigurationPackages();
}
@豆子
公共customScope配置器customScope(){
CustomScopeConfigurer configurer=新的CustomScopeConfigurer();
Map sessionScope=newhashmap();
put(“session”,newthreadscope());
配置器设置范围(会话范围);
返回配置器;
}
}
以下线程范围:

package net.weg.maestro;
导入org.springframework.beans.factory.ObjectFactory;
导入org.springframework.beans.factory.config.Scope;
导入org.springframework.core.NamedThreadLocal;
导入java.util.HashMap;
导入java.util.Map;
公共类ThreadScope实现作用域{
专用最终线程本地线程范围=
新名称ThreadLocal(ThreadScope.class.getName()){
@凌驾
受保护的映射初始值(){
返回新的HashMap();
}
};
@凌驾
公共对象获取(字符串名称,ObjectFactory ObjectFactory){
Map scope=this.threadScope.get();
Object=scope.get(name);
if(object==null){
object=objectFactory.getObject();
作用域