【发布时间】: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