2012-12-13 4 views
6

Ich habe festgestellt, "fehlende Abhängigkeit" Ausnahme beim Ausführen von ResourceTest mit Dropwizard: 0.6.1 (Trikot 1.15), hat jemand Erfahrung in diesem Fall?Dropwizard/Jersey - fehlende Abhängigkeit für öffentliche Methode beim Ausführen von Tests

Meine Testdatei:

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

Ausnahme:

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

Haben Sie es herausgefunden? Ich stochle mit etwas ähnliches – Kimble

+1

Ja, mein Problem war, dass ich eine HttpServletRequest injiziert, die von InMemory-Container unterstützt wird, müssen Sie in diesem Fall Anlegestelle GrizzlyWebTestContainer oder Jetty verwenden. Aber am Ende des Tages schrieb ich einen Integrationstest mit Python, um meine Webdienste zu testen. Es fällt viel einfacher aus. – Shengjie

Antwort

2

Mein Problem war, dass ich ein HttpServletRequest injiziert, die durch InMemory Behälter getragen wird, ich Anlegestelle grizzlyWebTestContainer oder Anlegesteg als Test contatiner in diesem Fall verwendet werden müssten. Das funktionierte mir auch nicht wirklich, denn die Einführung in Jersey-Test-Framework-Grizzly brachte eine Menge Abhängigkeitskonflikte gegen Dropwizard selbst mit sich. Ich erkläre, dass es sich nicht lohnt, alle Konflikte zu lösen, denn wenn ich den Dropwizard in der Zukunft aktualisiere, könnte das wieder passieren.

Am Ende des Tages, endete ich mit einem Jenkins-Job mit einigen Integrationstests (in Python), um meine Web-Services zu testen. z.B. Nach der Bereitstellung sollten einige http-Anfragen ausgelöst werden. Überprüfen Sie den Antwortcode und den Inhalt der Antwort. Es fällt viel einfacher aus.

2

wie Jersey Sieht nicht in der Lage ein HttpServletRequest

Ist eines Ihrer Endpunkte zu injizieren konfiguriert so was?

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

Wenn ja, möchten Sie vielleicht Ihr Design zu überdenken, und entscheiden sich stattdessen für

@Context 
private HttpContext context; 

public StreamingOutput something(String a, String b) { 

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

} 

, die eine sauberere Ansatz ergeben kann. Solange Sie sich auf die Ressourcenregistrierung Class verlassen, haben Sie garantiert eine neue Instanz pro Anfrage, die Threading-Probleme vermeiden sollte.

+0

Danke, ich habe festgestellt, dass HttpServletRequest nicht injiziert werden kann. Aber in meinem Fall möchte ich das Request-Attribut erhalten, indem ich HttpServletRequest.getAttribute ("blabla") aufruft, was anscheinend nicht von HttpContext bereitgestellt wird. – Shengjie

+0

Nicht sicher, ob es Ihnen helfen wird, aber es gibt einige Diskussionen über Attributextraktion hier: http://jersey.576304.n2.nabble.com/Why-doesn-t-HttpRequestContext-expose-request-attributes-td3953625.html –

+0

Ich habe das gleiche Problem. Hat das schon jemand behoben? Ich mache auch etwas blabla (@Context HttpServletRequest Anfrage, ...) und es funktioniert, aber in Tests schlägt es fehl. Wenn ich HttpContext verwende, brauche ich den Header, der vom Servlet-Filter gesetzt wird.Wie kann ich diesen Header aus der HttpContext-Schnittstelle holen? Irgendwelche Ideen? – heaphach

0

Die Art und Weise, wie ich das verstand, war, eine abstrakte Basisklassenressource zu definieren, ohne dass der Kontext injiziert wurde, und dann eine kleine abgeleitete Klasse für Ihren echten Dienst zu implementieren.

@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(); 
    } 
} 

Wenn Sie Ihre Tests ausführen, können Sie dann eine alternative abgeleitete Klasse implementieren nur für die Prüfung, die nicht die HttpServletRequest nicht verwendet. Der Bonusvorteil besteht hier darin, dass Ihre abgeleitete testbare Klasse einen fest codierten Wert für den Kontext (zum Beispiel) angeben kann, um einige geeignete Testszenarien zu erstellen.

Verwandte Themen