2011-10-09 16 views
5

JUnit ile test etmek istediğim bir Jersey Kaynağım var. Kaynak belirli alanları enjekte etmek Guice Sağlayıcıları kullanır: API hizmet için gerçek bir sunucu kullanılırken bu tüm güzel çalışıyorBirim testi Enjekte edilen alanlarla Jersey Kaynakları

@Path("/example/") 
class ExampleResource { 
    @Inject 
    Provider<ExampleActionHandler> getMyExampleActionHandlerProvider; 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public List<ExamplePojo> getExampleList() { 
     ExampleActionHandler handler = getMyExampleActionHandlerProvider.get(); 
     handler.doSomething(); 
    ... 

, ancak problemlidir test. Açıkça

public class ApiTest extends JerseyTest { 

    public ApiTest() throws Exception { 
    super(); 
    ApplicationDescriptor appDescriptor = new ApplicationDescriptor(); 
    appDescriptor.setContextPath("/api"); 
    appDescriptor.setRootResourcePackageName("com.my.package.name"); 
    super.setupTestEnvironment(appDescriptor); 
    } 

    @Test 
    public void testHelloWorld() throws Exception { 
    String responseMsg = webResource.path("example/").get(String.class); 
    Assert.assertEquals("{}", responseMsg); 
    } 
} 

, Guice handler.doSomething() çağrısı bir NullPointerException yol açmaz, böylece ExampleResource alanlara başlangıç ​​fırsatı almıyor:

Testim sınıfı şu anda şöyle görünür.

Jersey'e, Sağlayıcının çalışabilmesi için Guice'i kullanarak ExampleResource sınıfını başlatması için bir yol var mı?

+1

ile ondan applicationDescriptor nesneyi almak, ama kapalı şans hala görüyorsanız, siz ne yaptığını sona erdi? – talon8

+0

@minichate Bunu işe aldın mı? –

cevap

0

Bunu yapmanın bir yolu, testleri birkaç adıma ayırmaktır. Hizmeti yapılandırdığınız enjektörü oluşturmanız ve enjektörü test etmeniz gerekmektedir (bkz. Testing Guice Servlet bindings ve Testing Guice can init servlets). Bu testleri kullanarak doğru bağlantıları doğru yaptığınızdan emin olursunuz. Eğer enjektörü sahip olduktan sonra , bu biraz geç olduğunu biliyorum

ExampleResource exampleResource = injector.getInstance(ExampleResource.class); 
Assert.assertEquals(myList, getExampleList()); 
+0

Bu yaklaşımdaki sorun, Jersey'in yaptığı sihirin hiçbirinin - @DefaultValue() açıklamalı alanlar gibi kullanılabilir olmamasıdır. Ben aslında bunu istediğim şekilde çalışıyorum, sadece SO'da bir şeyleri post edebilmek için yapmaya çalışıyorum. – minichate

+0

Bu çalışma nasıl oldu? – bobK