Ich habe eine Anforderung, eine SpringBoot-Anwendung zu testen, wo ich die Tests gegen den Endpunkt (für jetzt, lokal) ausführen.Wie verspotten Sie externe Abhängigkeiten in Spring-Boot-Anwendung?
Es gibt einen Anruf von einem Dienst zu externen Service (s3
), und ich muss nur dies zu verspotten, so dass wir einen Live-Anruf zu s3
von unserem Test nicht tun.
Ich benutze Mockito zum Mocking.
Der Call-Stack:
Controller -service
-external service.
Von meinem Test, ich traf nur den Endpunkt url (localhost:8080/actions/domyjob
)
Dies ist mein Controller:
@RestController
@RequestMapping("/myjob")
public class MyController{
@Autowired
private MyService myService;
@RequestMapping(path = "/doJobInMyService", method = POST)
public void doJobInMyService(){
myService.doMyJob()
}
}
Das ist mein Service ist:
@Service
public class MyService {
@Autowired
private s3Client AmazonS3Client;
doMyJob() {
s3Client.putObject(new PutObjectRequest());
}
}
Wenn Sie sehen, wenn ich den gesamten Fluss testen möchte, indem Sie localhost:8080/myjob/doJobInMyService
aufrufen und nur s3Client.putObject(new PutObjectRequest())
mock, so dass externe Aufrufe an s3
nicht erfolgt ist.
dies versucht, aber ich hatte noch kein Glück:
@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);
}
Verwenden Sie Mockito, um eine Kopie des Clients zu erstellen, der den Dienst aufruft. – duffymo
Wir haben gerade den Endpunkt der Anwendung durch Tests erreicht. Nicht wirklich sicher, wie Frühling den verspotteten Klienten während der Prüfung und realen Klienten für Anwendungszweck einspritzen würde. – Diva
Ich habe keine Spring inject Mocks, wenn ich es teste. Ich schreibe JUnit Tests und mache die Injektion manuell mit Ctor-Injektion. Keine Notwendigkeit für den Frühling. – duffymo