【发布时间】:2017-04-10 13:58:14
【问题描述】:
我有一个使用 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 不高度依赖外部服务的解决方案是什么?
【问题讨论】:
-
你应该尝试使用一个 MockMvcBuilders 来帮助你像你一样从实际服务构建一个模拟,另外使用一些数据集来为你的测试提供一个内存内置数据库,它是 Spring DBUnit 测试框架的一部分
-
KuretoClient 用在什么地方?它在哪里以及如何注入?不应该将 ApplicationProperties 注入到 KuretoClient 中吗?我没有看到拥有额外类型的好处。
-
@slowy KurentoClient 的实例正在 WebSocket 处理程序上使用。此外,KurentoClient 是一个外部库,因此我无法将其注入内部:/
-
@AnthonyGranger:你可以轻松做到这一点;)。只需定义一个空接口并编写一个学习测试。这样您就可以测试您的预期行为,您可以在系统升级后运行该测试,并且您可以将该库与另一个外部系统交换。而且由于您已经编写了一个接口,因此您可以提供两种不同的 Spring 上下文,一种用于测试,一种用于生产……真正的实现只是委托给 KuretoClient。
-
@slowy 坦克你的回答 :) 但是,我怎么能告诉 Spring 在测试环境中使用我的模拟实现和真正的实现?
标签: java spring testing jhipster kurento