java - 使用 Spring 进行测试时如何不连接到服务?

标签 java spring testing jhipster kurento

我有一个使用 JHipster 构建的应用程序,其中包含多个测试。 我创建了一个简单的配置类来实例化一个连接到外部服务的 bean:

@Configuration
public class KurentoConfiguration {

    @Bean(name = "kurentoClient")
    public KurentoClient getKurentoClient(@Autowired ApplicationProperties applicationProperties) {
        return KurentoClient.create(applicationProperties.getKurento().getWsUrl());
    }
}

但是正如您所猜测的那样,这段代码在测试期间崩溃了,因为外部服务没有启动,但这段代码仍在应用程序上下文加载期间运行。

所以我需要创建这个 bean 的“无状态”版本以在测试期间使用。

这是一个由于我的配置而失败的测试的简单示例:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Face2FaceApp.class)
public class LogsResourceIntTest {

    private MockMvc restLogsMockMvc;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);

        LogsResource logsResource = new LogsResource();
        this.restLogsMockMvc = MockMvcBuilders
            .standaloneSetup(logsResource)
            .build();
    }

    @Test
    public void getAllLogs()throws Exception {
        restLogsMockMvc.perform(get("/management/logs"))
            .andExpect(status().isOk())
            .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE));
    }
}

有什么解决方案可以使这个 bean 在单元测试期间不高度依赖外部服务?

最佳答案

您可以在测试中使用 MockBean 注释来替换现有的 bean:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Face2FaceApp.class)
public class LogsResourceIntTest {

    @MockBean
    private KurentoClient kurentoClient;

    private MockMvc restLogsMockMvc;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);

        LogsResource logsResource = new LogsResource();
        this.restLogsMockMvc = MockMvcBuilders
            .standaloneSetup(logsResource)
            .build();
        given(kurentoClient.someCall()).willReturn("mock");
    }
    ....
}

这是 Spring Boot 文档: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html#boot-features-testing-spring-boot-applications-mocking-beans

关于java - 使用 Spring 进行测试时如何不连接到服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43325228/

相关文章:

java - 如何计算hibernate中两个字段之间差异的结果并将其显示在jsp上?

java - 多线程 Android 应用程序中的组件应该如何交互?

ruby-on-rails - 在哪里测试 ruby​​ on rails 中的路线

unit-testing - Odoo 9 没有运行测试

java - Spring SAML SSO - IDP 元数据不包含 SingleSignOnService

r - 在 RStudio 中调试 'testthat' 测试

java - 增量运营机制

java - 将嵌套 for 循环重构为 Java 8 流

java - Spring、Tomcat 6 和 ANT 构建脚本 : java. lang.ClassNotFoundException : org. springframework.web.context.ContextLoaderListener

java - 为什么deleteById遵循双向方法?