【问题标题】:How do you mock external dependencies in spring boot application?如何在 Spring Boot 应用程序中模拟外部依赖项?
【发布时间】:2016-05-05 11:13:13
【问题描述】:

我需要测试一个 SpringBoot 应用程序,在该应用程序中我针对端点(目前是本地)运行测试。

从服务到外部服务 (s3) 有一个调用,我只需要对此进行模拟,这样我们就不会从我们的测试中对 s3 进行实时调用。

我使用 Mockito 进行模拟。

调用栈:

Controller -service

                   -external service.

从我的测试来看,我刚刚打到了终点 url (localhost:8080/actions/domyjob)

这是我的控制器:

@RestController
@RequestMapping("/myjob")
public class MyController{

    @Autowired
    private MyService myService;

    @RequestMapping(path = "/doJobInMyService", method = POST)
    public void doJobInMyService(){
        myService.doMyJob()
    }

}

这是我的服务:

@Service
public class MyService {

    @Autowired
    private s3Client AmazonS3Client;

     doMyJob() {
    s3Client.putObject(new PutObjectRequest());
}
}

如果您看到,如果我想测试整个流程,请调用 localhost:8080/myjob/doJobInMyService 并模拟 s3Client.putObject(new PutObjectRequest()),这样就不会完成对 s3 的外部调用。

试过这个,但我还是没有运气:

@ActiveProfiles("MyTestConfig")
@RunWith(SpringJUnit4ClassRunner.class)
public class MyTest extends BaseTest {
    @Autowired
    private AmazonS3Client amazonS3Client;

    @Test
    public void testMyResponse() {
        try {
            Mockito.when(amazonS3Client.putObject(anyObject())).thenReturn(new PutObjectResult());
            assertNotNull(getMyClient().doMyJob());
        } catch(Exception e) {

        }
    }
}

@Profile("MyTestConfig")
@Configuration
public class MyTestConfiguration {

    @Bean
    @Primary
    public AmazonS3Client amazonS3Client() {
        return Mockito.mock(AmazonS3Client.class);
    }

【问题讨论】:

  • 使用 Mockito 创建调用服务的客户端的模拟。
  • 我们只是通过测试到达了应用程序的端点。不太确定 spring 如何在测试期间注入模拟客户端以及用于应用程序目的的真实客户端。
  • 我在测试时没有 Spring 注入模拟。我编写 JUnit 测试并使用 ctor 注入手动进行注入。那里不需要春天。
  • 这样做时是否调用了端点?一个很好的例子
  • 不,我调用客户端并告诉它返回我知道端点将为该输入提供的内容。这就是嘲笑。

标签: java spring-boot mockito junit4 functional-testing


【解决方案1】:

从 Spring Boot 1.4.x 开始,通过注解 @MockBean 原生支持 Spring bean 的 Mockito 模拟。请参阅this section of Spring Boot docs 了解更多信息。

【讨论】:

    【解决方案2】:

    我创建了blog post on the topic。它还包含指向带有工作示例的 Github 存储库的链接。

    诀窍是使用测试配置,在该配置中,您使用伪造的 spring bean 覆盖原始的 spring bean(例如 s3Client 在您的情况下)。您可以使用 @Primary@Profile 注释来实现此技巧。

    【讨论】:

    • 我试过了,但没有运气。在帖子中使用您的解决方案更新了我的方法。
    • @Pete,你能说得更具体点吗?我在 FF 而不是 Chrome 中看不到问题。
    • @luboskrnac,昨天还不行,今天好了,没问题
    • 是的,可能是 Cloudflare 打嗝。
    猜你喜欢
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 2018-10-07
    • 2019-01-18
    • 1970-01-01
    • 2021-01-01
    相关资源
    最近更新 更多