当前位置: 首页 > 知识库问答 >
问题:

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

葛骏
2023-03-14
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = TestContextSpringConfig.class)
public class MethodTest {

    @Autowired
    private BeanSession beanSession;
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("net.foo")
public class TestContextSpringConfig {

    @Bean // Fancy bean
    public ConfigurationPackages configurationPackages() {
        return new ConfigurationPackages();
    }

    // How to mock the session bean?

}

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

共有1个答案

濮彬
2023-03-14

我找到答案了。响应是这个POST stackoverflow和这个MemoryNotFound的混合。

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

@Configuration
@ComponentScan("net.foo")
public class TestContextSpringConfig {

    @Bean
    public ConfigurationPackages configurationPackages() {
        return new ConfigurationPackages();
    }

    @Bean
    public CustomScopeConfigurer customScope() {
        CustomScopeConfigurer configurer = new CustomScopeConfigurer();
        Map<String, Object> sessionScope = new HashMap<>();
        sessionScope.put("session", new ThreadScope());
        configurer.setScopes(sessionScope);
        return configurer;
    }
}

以下ThreadScope:

package net.weg.maestro;

import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.config.Scope;
import org.springframework.core.NamedThreadLocal;
import java.util.HashMap;
import java.util.Map;

public class ThreadScope implements Scope {

    private final ThreadLocal<Map<String, Object>> threadScope =
            new NamedThreadLocal<Map<String, Object>>(ThreadScope.class.getName()) {
                @Override
                protected Map<String, Object> initialValue() {
                    return new HashMap<String, Object>();
                }
            };

    @Override
    public Object get(String name, ObjectFactory<?> objectFactory) {
        Map<String, Object> scope = this.threadScope.get();
        Object object = scope.get(name);
        if (object == null) {
            object = objectFactory.getObject();
            scope.put(name, object);
        }
        return object;
    }

    @Override
    public Object remove(String name) {
        Map<String, Object> scope = this.threadScope.get();
        return scope.remove(name);
    }

    @Override
    public void registerDestructionCallback(String name, Runnable callback) {
    }

    @Override
    public Object resolveContextualObject(String key) {
        return null;
    }

    @Override
    public String getConversationId() {
        return Thread.currentThread().getName();
    }

    public void clear(){
        Map<String, Object> scope = this.threadScope.get();
        scope.clear();
    }
}
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = TestContextSpringConfig.class)
public class MethodTest {

    @Autowired
    private BeanSession beanSession; // Session bean

@Test
    public void parameterReachabilityTest() {
        ObjectA objectA = new ObjectA();
        ObjectB objectB = new ObjectB();
        objectA.getObjectBList().add(objectB);
        objectB.setObjectA(objectA);
        beanSession.setRootState(objectA); // Using session bean
        ObjectBComponent objectBComponent = maestro.getComp(objectB, ObjectBComponent.class);
        objectBComponent.parameterReachableTest();
        assertThat((Object) objectBComponent.getThreadValue("objectBComponent")).isNotNull();
        assertThat((Object) objectBComponent.getThreadValue("objectAComponent")).isNotNull();
    }
}
 类似资料:
  • 如何模拟集成测试所需的许多依赖关系? 我使用Mockito进行纯单元测试。在这种情况下,Pure意味着测试一个类,嘲笑它的所有依赖关系。漂亮。 现在是集成测试。假设在这种情况下,集成测试将测试以下内容: 消息被放入队列 我们也可以说,在第2步中发生的处理是严肃的事情。它依赖于大量的数据库交互、多种外部服务、文件系统,以及各种各样的东西。流还会引发很多副作用,所以我不能简单地确保响应是正确的——我需

  • 在用注释并使用)运行的Spring启动集成测试中,我可以通过 restTemplate和将真正的http post调用放到我的rest控制器。 这工作正常,就在控制器的末端 -

  • 我发现可以使用以下方法模拟和: 它工作得很好,但当我尝试运行集成测试时,授权服务器仍然需要启动并运行。否则,Quarkus无法连接到它。 我试图禁用OIDC扩展(),但是代码当然不能编译(endpoint不能识别依赖项)。 那么,在运行集成测试时,哪一种方法是跳过OIDC连接的最佳方法呢? 最好的,

  • 情况和问题:在Spring Boot中,我如何将一个或多个模拟类/bean注入应用程序以进行集成测试?在StackOverflow上有一些答案,但它们集中在Spring Boot 1.4之前的情况,或者只是不适合我。 背景是,在下面的代码中,设置的实现依赖于第三方服务器和其他外部系统。设置的功能已经在单元测试中测试过了,所以对于完整的集成测试,我想模拟出对这些服务器或系统的依赖,只提供虚拟值。 M

  • 在Spring Security中,我注入以从env变量读取凭据。在集成测试中,我希望模拟接口,以便更改测试的env变量。 下面是我的测试: 最好的方法是什么?