2012-12-13 7 views
6

Ho riscontrato un'eccezione "Dipendenza mancante" durante l'esecuzione di resourceTest utilizzando Dropwizard: 0.6.1 (jersey 1.15), qualcuno ha esperienza in questo caso?Dropwizard/Jersey: manca la dipendenza per il metodo pubblico durante l'esecuzione dei test

mio file di prova:

public class MyResourceImplTest extends ResourceTest { 
    ........ 
    @Override 
    protected void setUpResources() throws Exception { 
     addResource(new MyResourceImpl(new myConfiguration())); 
    } 
} 

Eccezione:

Dec 13, 2012 2:10:41 PM com.sun.jersey.test.framework.spi.container.inmemory.InMemoryTestContainerFactory$InMemoryTestContainer <init> 
INFO: Creating low level InMemory test container configured at the base URI http://localhost:9998/ 
Dec 13, 2012 2:10:42 PM com.sun.jersey.test.framework.spi.container.inmemory.InMemoryTestContainerFactory$InMemoryTestContainer start 
INFO: Starting low level InMemory test container 
Dec 13, 2012 2:10:42 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate 
INFO: Initiating Jersey application, version 'Jersey: 1.15 10/30/2012 02:40 PM' 
Dec 13, 2012 2:10:42 PM com.sun.jersey.spi.inject.Errors processErrorMessages 
SEVERE: The following errors and warnings have been detected with resource and/or provider classes: 
    SEVERE: Missing dependency for method public javax.ws.rs.core.StreamingOutput com.****************.********(javax.servlet.http.HttpServletRequest,java.lang.String,java.lang.String) at parameter at index 0 
Dec 13, 2012 2:10:42 PM com.sun.jersey.test.framework.spi.container.inmemory.InMemoryTestContainerFactory$InMemoryTestContainer stop 
INFO: Stopping low level InMemory test container 
+0

Hai capito? Sto facendo il tifo con qualcosa di simile – Kimble

+1

Sì, il mio problema era che, ho iniettato una HttpServletRequest che è supportata dal contenitore InMemory, in questo caso è necessario utilizzare jetty grizzlyWebTestContainer o jetty. Ma alla fine della giornata, ho finito per scrivere un test di integrazione usando python per testare i miei servizi web. Risulta molto più facile. – Shengjie

risposta

2

Il mio problema era che, ho iniettato un HttpServletRequest che è supportato dal contenitore InMemory, avrei bisogno di usare jetty grizzlyWebTestContainer o molo come contatatore di test in questo caso. Non ho nemmeno capito che non funzionasse nemmeno, perché introdurre in jersey-test-framework-grizzly ha portato molti conflitti di dipendenza contro il dropwizard stesso. Ricordo che non vale la pena provare a risolvere tutti i conflitti, perché quando aggiornerò il dropwizard in futuro, questo potrebbe accadere di nuovo.

Alla fine del giorno, ho finito per avere un lavoro jenkins con alcuni test di integrazione (in python) per testare i miei servizi web. per esempio. dopo la distribuzione, attivare alcune richieste http, controllare il codice di risposta e il contenuto della risposta. Risulta molto più facile.

2

Sembra Jersey non è in grado di iniettare un HttpServletRequest

è uno dei vostri endpoint configurato come questo?

public StreamingOutput something(@Context HttpServletRequest request, String a, String b) {} 

Se è così, si potrebbe voler ripensare il vostro disegno, e optare invece per

@Context 
private HttpContext context; 

public StreamingOutput something(String a, String b) { 

    System.out.println("Request info "+context.getRequest().getAbsolutePath()); 

} 

che può produrre un approccio più pulito. Finché ci si basa sulla registrazione delle risorse Class, si garantisce una nuova istanza per richiesta che dovrebbe evitare problemi di threading.

+0

Grazie, ho notato che HttpServletRequest non può essere iniettato. Ma nel mio caso, voglio ottenere l'attributo di richiesta chiamando HttpServletRequest.getAttribute ("blabla") che non sembra fornito da HttpContext. – Shengjie

+0

Non sono sicuro se ti sarà d'aiuto, ma qui c'è qualche discussione sull'estrazione degli attributi: http://jersey.576304.n2.nabble.com/Why-doesn-t-HttpRequestContext-expose-request-attributes-td3953625.html –

+0

Ho lo stesso problema. Qualcuno ha già risolto questo? Sto anche facendo un po 'di blabla (@Context HttpServletRequest request, ...) e funziona, ma nei test fallisce. Se utilizzo HttpContext, allora ho bisogno dell'intestazione impostata dal filtro servlet.Come posso ottenere questa intestazione di interfaccia HttpContext? Qualche idea? – heaphach

0

Il modo in cui ho risolto questo problema era di definire una risorsa di classe base astratta senza il contesto iniettato, quindi implementare una piccola classe derivata per il tuo vero servizio.

@Path("/contextMethod") 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public class MyResourceWithContext extends BaseResource { 
    @Context 
    private HttpServletRequest request; 

    protected String getUserID() 
    { 
     return request.getRemoteUser(); 
    } 
} 

Quando si esegue il test, è quindi implementare una classe derivata alternativo solo per i test, che non usa il HttpServletRequest. Il vantaggio del bonus qui è che la classe testabile derivata può inserire un valore codificato nel contesto per creare alcuni scenari di test adatti.

Problemi correlati