2016-05-05 1 views
0

J'ai une exigence pour tester une application SpringBoot où j'exécute les tests par rapport au point final (pour l'instant, localement).Comment vous moquez-vous des dépendances externes dans l'application de démarrage de printemps?

Il y a un appel d'un service au service externe (s3), et j'ai juste besoin de simuler ceci, de sorte que nous ne faisons pas un appel en direct à s3 de notre test. J'utilise Mockito pour les moqueurs.

La pile d'appel:

Controller -service 

        -external service. 

De mon test, je viens de frapper le point final url (localhost:8080/actions/domyjob)

Ceci est mon contrôleur:

@RestController 
@RequestMapping("/myjob") 
public class MyController{ 

    @Autowired 
    private MyService myService; 

    @RequestMapping(path = "/doJobInMyService", method = POST) 
    public void doJobInMyService(){ 
     myService.doMyJob() 
    } 

} 

Ceci est mon service:

@Service 
public class MyService { 

    @Autowired 
    private s3Client AmazonS3Client; 

    doMyJob() { 
    s3Client.putObject(new PutObjectRequest()); 
} 
} 

Si vous voyez, si je veux tester l'ensemble du flux, en appelant localhost:8080/myjob/doJobInMyService et juste simuler s3Client.putObject(new PutObjectRequest()), de sorte que les appels externes à s3 ne soit pas fait.

ai essayé, mais je n'avais toujours pas de chance:

@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

Utilisez Mockito pour créer une simulation du client qui appelle le service. – duffymo

+0

Nous venons de frapper le point de terminaison de l'application grâce à des tests. Pas vraiment sûr comment le printemps injecterait le client moqué pendant le test et le client réel à des fins d'application. – Diva

+0

Je n'ai pas de ressort injecter des mocks quand je teste. J'écris des tests JUnit et je fais l'injection manuellement en utilisant l'injection de ctor. Pas besoin de printemps là-bas. – duffymo

Répondre

0

J'ai créé blog post on the topic. Il contient également un lien vers le référentiel Github avec un exemple de travail.

L'astuce consiste à utiliser la configuration de test, où vous remplacez le haricot d'origine (par exemple s3Client dans votre cas) avec un faux. Vous pouvez utiliser les annotations @Primary et @Profile pour cette astuce. Depuis Spring Boot 1.4.x, Mockito se moquera des haricots Spring nativement pris en charge par l'annotation @MockBean

+0

J'ai essayé, mais pas de chance. J'ai mis à jour mon approche en utilisant votre solution dans le message. – Diva

+0

Votre site web a une erreur de certificat SSL :( – Pete

+0

@Pete, pourriez-vous s'il vous plaît être plus précis? Je ne vois pas le problème dans FF pas Chrome. – luboskrnac