如何在spring启动应用程序中模拟外部依赖项?

时间:2016-05-05 11:13:14

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

我需要测试一个SpringBoot应用程序,在那里我针对终点运行测试(现在,在本地)。

从服务到外部服务(s3)有一个电话,我只需要嘲笑这个,这样我们就不会在测试中对s3进行实时调用。< / p>

我使用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);
    }

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

诀窍是使用测试配置,你可以用假的覆盖原始的spring bean(例如你的s3Client)。您可以使用@Primary@Profile注释来完成此操作。