@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'
我找到答案了。响应是这个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变量。 下面是我的测试: 最好的方法是什么?