6
votes

Demande HTTPS simulée en Java

Disons que j'écris une application et je dois pouvoir faire quelque chose comme ceci:

String url = "https://someurl/";
GetMethod method = new GetMethod(URLEncoder.encode(url));
String content = method.getResponseBodyAsString();


2 commentaires

Voici une question similaire il traite des pages JSP de débogage, mais cela fonctionne la même chose avec des pages statiques


Dupliqué possible de Stackoverflow.com/q/393099/2093341


8 Réponses :


1
votes

JEWBUNIT http://jwebunit.sourceforge.net/

Voici un Exemple d'essai ... c'est vraiment assez intuitif. xxx


1 commentaires

Oui, je connais avec Jwebunit, mais ici, je dois être capable de se moquer de l'URL actuelle. Jwebunit fonctionne lorsque le site Web / le service que vous appelez est en cours d'exécution.



1
votes

Vous pouvez toujours lancer un serveur THTTPD dans le test de votre appareil pour servir les demandes localement. Bien que, idéalement, vous avez un getMethod bien testé, puis vous pouvez simplement vous moquer de cela et ne pas avoir à avoir un serveur distant autour de tous vos tests.

ressources


0 commentaires

2
votes

Vous pouvez envelopper ce code dans une classe et avoir webclient.geturl () puis simulés (par exemple, jmock ) Cette méthode pour renvoyer des fichiers stockés - disons xxx


0 commentaires

2
votes

Si vous écrivez un test d'unité, vous ne voulez pas de dépendances externes. De l'API,

method.getResponseBodyAsString()


5 commentaires

Mais la getMethod est en cours de création dans le code lui-même, pas dans mon test de l'unité, je ne peux donc pas se moquer de cela.


Je ne comprends pas, vous ne contrôlez pas le code que vous testez?


Je contrôle le code, mais l'objet getMethod est en cours de création de la méthode que je teste, donc je ne peux pas passer à un objet simulé. La façon dont une maquette fonctionne est que vous le configurez à l'avance et que vous le transmettez à la méthode que vous testez, mais dans ce cas, l'objet getMethod est créé à l'intérieur de la méthode elle-même, donc je ne peux donc pas le transmettre. Si c'est Pas clair, s'il vous plaît laissez-moi savoir.


@DCP, ah gotya maintenant. Eh bien, la réponse évidente est le refacteur pour vous injecter ou simplement définir le httpmethod que vous voulez ... Cela pourrait être mieux que d'utiliser une dépendance externe pour aller sur le Web, ce qui va échouer de manière inattendue. Mieux avoir une cohérence dans les tests ...


Vous n'êtes pas sûr de ce que vous entendez par «Refectory vous injecter ou simplement définir le HTTPMETHOD que vous voulez», pouvez-vous élaborer? L'autre idée que j'avais était de créer une maquette pour le client HTTP, puis je pourrais faire ce que je voulais (c'est-à-dire que je créerais mes propres implémentations simulées pour GetMethod, etc.).



1
votes

À quelle étendue êtes-vous intéressé à moquer de cet appel "Get", car si vous recherchez un cadre de moqueur à usage général pour Java, qui s'intègre bien à Junit et permet de configurer les attentes qui sont automatiquement affirmées lorsqu'elles sont incorporées dans une suite JUnit , alors vous devez vraiment jeter un coup d'œil à jmock .

Maintenant sans autre code, il est difficile de déterminer Que ce soit en fait ce que vous recherchez, mais un exemple (un peu inutile), de quelque chose de similaire à celui que vous avez écrit, irait quelque chose comme ceci: xxx


1 commentaires

HMM, alors je pourrais envisager d'utiliser un cadre d'extension Java telle que des équipes d'objet, capables de réacheminer des appels de méthode spécifiques à vos propres méthodes définies, vous pouvez ainsi appuyer sur le point précis du flux de contrôle dont vous avez besoin pour modifier, à injecter soit votre propre code ou votre objet moqué. Peu importe qu'il s'agisse d'une méthode publique ou privée, les objectifs agissent comme une superset à Java, vous pouvez donc faire des choses que Java ne serait normalement pas capable de faire.



3
votes

Vous avez essentiellement deux options:

1. Résumé de l'appel au cadre et testez cela.

E.g. Réfacteur le code pour vous permettre d'injecter une implémentation simulée à un moment donné. Il y a beaucoup de façons de faire cela. par exemple. Créez un getURLassRing () et moquez cela. (également suggéré ci-dessus). Ou créer une usine Getter URL qui renvoie un objet getMethod. L'usine peut alors être moquée.

2. Démarrez un serveur d'applications dans le test, puis exécutez votre méthode. (Ce sera plus d'un test d'intégration)

Ceci peut être atteint de plusieurs manières. Cela peut être externe au test E.G. le plugin de jetty maven. ou le test peut démarrer par programme le serveur. Voir: http://docs.codehaus.org/display/jetty/embedding+Jetty

Le fonctionnement sur HTTPS compliquera cela, mais il sera toujours possible avec des certificats auto-signés. Mais je vous demanderais - ce que vous voulez tester exactement? Je doute que vous ayez réellement besoin de tester la fonctionnalité HTTPS, sa technologie éprouvée.

Personnellement, j'irais pour l'option 1 - Vous essayez de tester la fonctionnalité d'une bibliothèque externe. C'est généralement inutile. Il est également une bonne pratique pour résumer vos dépendances aux bibliothèques externes.

J'espère que cela aide.


0 commentaires

5
votes

Jetez un coup d'oeil à Jadler ( http://jadler.net ), une bibliothèque HTTP STABBING / MOCKING DI travaillé depuis quelque temps. La version stable 1.0.0 vient de sortir, elle devrait fournir les capacités que vous avez demandées:

@Test
public void getAccount() {

    onRequest()
        .havingMethodEqualTo("GET")
        .havingURIEqualTo("/accounts/1")
        .havingBody(isEmptyOrNullString())
        .havingHeaderEqualTo("Accept", "application/json")
    .respond()
        .withTimeout(2, SECONDS)
        .withStatus(200)
        .withBody("{\"account\":{\"id\" : 1}}")
        .withEncoding(Charset.forName("UTF-8"))
        .withContentType("application/json; charset=UTF-8");

    final AccountService service = new AccountServiceRestImpl("http", "localhost", port());
    final Account account = service.getAccount(1);

    assertThat(account, is(notNullValue()));
    assertThat(account.getId(), is(1));
}


@Test
public void deleteAccount() {

    onRequest()
        .havingMethodEqualTo("DELETE")
        .havingPathEqualTo("/accounts/1")
    .respond()
        .withStatus(204);

    final AccountService service = new AccountServiceRestImpl("http", "localhost", port());
    service.deleteAccount(1);

    verifyThatRequest()
        .havingMethodEqualTo("DELETE")
        .havingPathEqualTo("/accounts/1")
    .receivedOnce();
}


0 commentaires

0
votes

Utilisez XML Mimic Stub Server, qui peut simuler une réponse HTTP statique en fonction des paramètres de la demande, des en-têtes, etc. Il est très simple de la configurer et de l'utiliser.

http://xmlmimic.sourceforge.net/ http://sourceforge.net/projects/xmlmimic/


0 commentaires