2016-05-05 4 views
0

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); 
    } 
+0

Verwenden Sie Mockito, um eine Kopie des Clients zu erstellen, der den Dienst aufruft. – duffymo

+0

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

+0

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

Antwort

0

I blog post on the topic erstellt. Es enthält auch eine Verknüpfung zum Github-Repository mit einem Arbeitsbeispiel.

Der Trick besteht darin, Testkonfiguration zu verwenden, wo Sie ursprüngliche Frühlingsbohne (z. B. s3Client in Ihrem Fall) mit gefälschtem überschreiben. Sie können @Primary und @Profile Annotationen für diesen Trick verwenden.

+0

Ich habe versucht, aber kein Glück. Habe meinen Ansatz mit Ihrer Lösung in der Post aktualisiert. – Diva

+0

Ihre Website hat ein SSL-Zertifikat Fehler :( – Pete

+0

@Pete, könnten Sie bitte genauer? Ich sehe das Problem in FF nicht Chrome. – luboskrnac

1

Seit Spring Boot 1.4.x gibt es Mockito Mocking von Spring Bohnen nativ unterstützt durch Annotation @MockBean. Siehe für weitere Informationen.

Verwandte Themen