2010-02-22 3 views
4

Utilisation de Restlet J'ai créé un routeur pour mon application Java. À l'aide de curl, je sais que chacune des différentes demandes DELETE GET, POST & fonctionne pour chacun des URI et renvoie la réponse JSON correcte. Je veux mettre en place des tests JUnit pour chacun des URI afin de faciliter le processus de test. Cependant, je ne suis pas sûr de la meilleure façon de faire la demande à chacun des URI afin d'obtenir la réponse JSON que je peux ensuite comparer pour m'assurer que les résultats sont comme prévu. Des idées sur la façon de faire cela?Exécution de tests JUnit sur un routeur de réplication

+0

J'avais une question similaire http://stackoverflow.com/questions/2165561/ways- to-test-reposful-services. reste-client devrait fonctionner assez bien pour votre scénario. – Daff

+0

C'est proche, mais pas tout à fait ce que je cherche. Ce serait bien si je pouvais mettre en place des suites de tests, etc. Cela amène aussi le problème de tous les membres de l'équipe ayant besoin d'avoir accès à cette interface. – Lee

Répondre

6

Vous pouvez simplement utiliser un Restlet Client pour faire des requêtes, puis vérifier chaque réponse et sa représentation.

Par exemple:

Client client = new Client(Protocol.HTTP); 
Request request = new Request(Method.GET, resourceRef); 
Response response = client.handle(request); 

assert response.getStatus().getCode() == 200; 
assert response.isEntityAvailable(); 
assert response.getEntity().getMediaType().equals(MediaType.TEXT_HTML); 

// Representation.getText() empties the InputStream, so we need to store the text in a variable 
String text = response.getEntity().getText(); 
assert text.contains("search string"); 
assert text.contains("another search string"); 

Je suis en fait pas familier avec JUnit, assert ou tests unitaires en général, je présente mes excuses s'il y a quelque chose avec mon exemple. J'espère que cela illustre encore une approche possible des tests.

Bonne chance!

+0

C'était génial. Avec affirmer c'est assertTrue (...) pour quelqu'un d'autre en utilisant l'exemple, mais parfait en dehors de cela. Merci – Lee

+0

Mon plaisir, heureux d'aider! BTW Je vous recommande d'essayer Groovy pour ce genre de chose - il rend les tests plus concis. Il est particulièrement bon qu'il ait des raccourcis getter et setter, et == signifie l'égalité des valeurs. Ainsi, au lieu de response.getEntity(). GetMediaType(). Est égal à (MediaType.TEXT_HTML), vous pouvez écrire response.entity.mediaType == MediaType.TEXT_HTML. HTH! –

3

Unité test d'un ServerResource

// Code under test 
public class MyServerResource extends ServerResource { 
    @Get 
    public String getResource() { 
    // ...... 
    } 
} 

// Test code 
@Autowired 
private SpringBeanRouter router; 
@Autowired 
private MyServerResource myServerResource; 

String resourceUri = "/project/1234"; 
Request request = new Request(Method.GET, resourceUri); 
Response response = new Response(request); 
router.handle(request, response); 
assertEquals(200, response.getStatus().getCode()); 
assertTrue(response.isEntityAvailable()); 
assertEquals(MediaType.TEXT_PLAIN, response.getEntity().getMediaType()); 
String responseString = response.getEntityAsText(); 
assertNotNull(responseString); 

où le router et la ressource sont @Autowired dans ma classe de test. Les déclarations pertinentes dans le contexte d'application Spring ressemble

<bean name="router" class="org.restlet.ext.spring.SpringBeanRouter" /> 
<bean id="myApplication" class="com.example.MyApplication"> 
    <property name="root" ref="router" /> 
</bean> 
<bean name="/project/{project_id}" 
     class="com.example.MyServerResource" scope="prototype" autowire="byName" /> 

Et le myApplication est similaire à

public class MyApplication extends Application { 
} 
0

Basé sur le answer of Avi Flax i réécris ce code java et l'exécuter avec junitparams, une bibliothèque qui permet passer des tests paramétrés. Le code ressemble à:

@RunWith(JUnitParamsRunner.class) 
public class RestServicesAreUpTest { 

    @Test 
    @Parameters({ 
     "http://url:port/path/api/rest/1, 200, true", 
     "http://url:port/path/api/rest/2, 200, true", }) 
    public void restServicesAreUp(String uri, int responseCode, 
     boolean responseAvaliable) { 
    Client client = new Client(Protocol.HTTP); 
    Request request = new Request(Method.GET, uri); 
    Response response = client.handle(request); 

    assertEquals(responseCode, response.getStatus().getCode()); 
    assertEquals(responseAvaliable, response.isEntityAvailable()); 
    assertEquals(MediaType.APPLICATION_JSON, response.getEntity() 
     .getMediaType()); 

    } 
} 
+0

comment puis-je ajouter une requête de défi dans junit? –

1

Je suis la réponse pour les paramètres de réponse de défi en cas de test JUnit REST

@Test 
public void test() { 
    String url ="http://localhost:8190/project/user/status"; 
    Client client = new Client(Protocol.HTTP); 
    ChallengeResponse challengeResponse = new ChallengeResponse(ChallengeScheme.HTTP_BASIC,"user", "f399b0a660f684b2c5a6b4c054f22d89"); 
    Request request = new Request(Method.GET, url); 
    request.setChallengeResponse(challengeResponse); 
    Response response = client.handle(request); 
    System.out.println("request"+response.getStatus().getCode()); 
    System.out.println("request test::"+response.getEntityAsText()); 
} 
Questions connexes