我需要测试一个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);
}
答案 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
注释来完成此操作。