2014-10-15 6 views
6

के साथ ड्रॉपविज़ार्ड एकीकृत परीक्षण क्या कोई जानता है कि कोई परीक्षण संसाधन कैसे जोड़ना है (यानी केवल परीक्षण उद्देश्यों के लिए है और ऐप के रन() विधि में नहीं जोड़ा गया है)?टेस्ट रिसोर्स

यहाँ एक उदाहरण है:

public class MyTest { 
    @ClassRule 
    public static final DropwizardAppRule<TestConfiguration> RULE = 
      new DropwizardAppRule<TestConfiguration>(MyApp.class, "my-app-config.yaml"); 


    @BeforeClass 
    public static void setUpBeforeClass() throws Exception 
    { 
     MyTest.RULE.getEnvironment().jersey().register(new JustForTestingResource()); 
    } 


    @Test 
    public final void testTestResource() 
    { 
     Client client = new Client(); 

     ClientResponse response = client.resource(
      String.format("http://localhost:%d/rest/v1/test", RULE.getLocalPort())) 
      .get(ClientResponse.class); 

     assertThat(response.getStatus(), is(200)); 
    } 
} 

और

public class JustForTestingRessource { 


    @GET 
    @Path("test") 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response getInTestResource() 
    { 
     return Response.status(Status.OK).type(MediaType.TEXT_PLAIN).entity("get @Path(\"test\") is ok").build(); 
    } 
} 

मेरे समस्या यह है कि जोड़ा संसाधन नहीं जोड़ा है और मैं संसाधन नहीं मिला 404 त्रुटि प्रतिक्रिया मिल है। ऐसा लगता है कि मैं संसाधन प्रकाशन के बाद नया संसाधन पंजीकृत कर रहा हूं और शुरुआत के बाद ड्रॉपविज़ार्ड के अंदर कोई ताज़ा नहीं है।

मैं अपनी एप्लिकेशन कक्षा का विस्तार नहीं करना चाहता हूं और मैं अपने वास्तविक एप्लिकेशन कोड में टेस्ट कोड डालना नहीं चाहता हूं। क्या कोई जानता है कि आवेदन के रन() विधि में पंजीकरण किए बिना परीक्षण संसाधन को कैसे पंजीकृत किया जाए?

यह काम करता है, लेकिन एक नया वर्ग की जरूरत है:

public class TestService extends MyService{ 


    @Override 
    public void run(
     TestConfigurationconfiguration, 
     Environment environment) throws ClassNotFoundException 
    {  
     environment.jersey().register(new JustForTestingRessource()); 
     super.run(configuration,environment); 
    } 

} 

JUnit में कॉल पहले से ही जाना जाता है:

@ClassRule 
public static DropwizardAppRule<TestConfiguration> RULE = 
     new DropwizardAppRule<TestConfiguration>(TestService.class, "my-app-config.yaml"); 
+0

कुछ RULE.addRessource (...) की तरह फैली होगी अच्छा ... – user3280180

उत्तर

5

संपादित करें: पिछले उत्तर को हटा रहा है क्योंकि इसने आपकी समस्या को हल करने के तरीके को हल नहीं किया है।

मैंने पर्यावरण स्टार्टअप कोड में खोला और इस कारण को महसूस किया कि नियंत्रक को पंजीकृत करने से यह उपलब्ध नहीं हुआ क्योंकि जेटी पहले ही शुरू हो चुकी है। यदि आप जेटी को रोकते हैं, तो अपने कंट्रोलर को पंजीकृत करें और जेटी को दोबारा शुरू करें, आपका संसाधन उपलब्ध होगा और आप इसे अपने परीक्षण में इस्तेमाल कर सकते हैं।

@BeforeClass 
public static void setUpBeforeClass() throws Exception 
{ 
    MyTest.RULE.environment.applicationContext.stop() 
    MyTest.RULE.environment.jersey().register(new JustForTestingResource()) 
    MyTest.RULE.environment.applicationContext.start() 
} 
+0

हाँ लेकिन फिर मेरे आवेदन में अतिरिक्त टेस्टकोड भी है। यह रोकने के लिए कि ऊपर वर्णित एक वर्ग बनाने के लिए MyApplication को विस्तारित करना और ओवरराइट() को ओवरराइट करना बेहतर है। लेकिन मैंने टेस्ट क्लास में संसाधन जोड़ने के बेहतर समाधान की मांग की, और इसलिए मैं आपके समाधान से सहमत नहीं हो सकता। – user3280180

+0

क्या आप विस्तार से बता सकते हैं कि पर्यावरण चर की जांच करने के लिए विशिष्ट कोड की तीन पंक्तियां एक अस्वीकार्य विकल्प क्यों है? – th3morg

+0

मैं लाइवकोड में टेस्टकोड से बचता हूं, इसलिए मेरी कक्षा टेस्ट सर्विस सेवा भी माइक्रोसॉफ्ट एक बेहतर समाधान है, क्योंकि मेरे पास मेरे आवेदन में "केवल उद्देश्य के उद्देश्य के लिए" विधियां नहीं हैं। इस ओवरराइट रन() विधि के साथ मैं स्पष्ट रूप से अपने परीक्षण- और लाइवकोड को अलग कर सकता हूं। आपके समाधान के साथ आपके लाइव * .yml के अंदर गलत कॉन्फ़िगरेशन करना संभव होगा और फिर आपके पास अपने एप्लिकेशन में परीक्षण के लिए कोड की रेखाएं होंगी। – user3280180

2

आप एक पूरे DW प्रारंभ किए बिना संसाधन अपने आप में एक जर्सी कंटेनर में परीक्षण कर सकते हैं -instance।

"Testing Resources" section देखें।

import static org.fest.assertions.api.Assertions.assertThat; 
import static org.mockito.Mockito.*; 

public class PersonResourceTest { 

    private static final PeopleStore dao = mock(PeopleStore.class); 

    @ClassRule 
    public static final ResourceTestRule resources = ResourceTestRule.builder() 
     .addResource(new PersonResource(dao)) 
     .build(); 

    private final Person person = new Person("blah", "[email protected]"); 

    @Before 
    public void setup() { 
     when(dao.fetchPerson(eq("blah"))).thenReturn(person); 
     // we have to reset the mock after each test because of the 
     // @ClassRule, or use a @Rule as mentioned below. 
     reset(dao); 
    } 

    @Test 
    public void testGetPerson() { 
     assertThat(resources.client().resource("/person/blah").get(Person.class)) 
      .isEqualTo(person); 
     verify(dao).fetchPerson("blah"); 
    } 
} 
+0

मैंने संसाधन परीक्षण पहले से ही बनाए हैं, लेकिन मैंने एक नया फ़िल्टर डाला और यही कारण है कि मुझे "एक पूर्ण dw-instance" की आवश्यकता क्यों है। – user3280180

0

मैं @ClassRule के साथ इसी तरह मुद्दा था, शायद यह किसी से मदद कर सकते हैं ..
अपने परीक्षण (ग्रूवी) RULE.getApplication के आह्वान() या getEnvironment() @BeforeClass विधि से में लौटे अशक्त:

def setupSpec() { 
    RULE.application.run() 
} 

दिखाया

java.lang.NullPointerException: Cannot invoke method run() on null object 

Ie RULE.testSupport दोनों शून्य अनुप्रयोग और पर्यावरण था।

मुझे पता चला कि RULE.testSupport पर कॉल करें।पहले() बस से पहले रन() त्रुटि को हल करती है:

def setupSpec() { 
    RULE.testSupport.before() 
    RULE.application.run() 
} 

और फिर @AfterClass विधि:

def cleanupSpec() { 
    RULE.testSupport.after() 
} 

या बस @ClassRule के बजाय @Rule का उपयोग करें और फोन

def setup() { 
    RULE.application.run() 
} 

@BeforeClass की बजाय @Before विधि के अंदर।
कुछ अन्य बेहतर समाधान मौजूद है हालांकि यह अजीब लगता है, शायद वहाँ है ..

0

सार्वजनिक वर्ग TestMain मुख्य {

public static void main(String ... args) throws Exception { 
    new TestMain().run(args); 
} 


@Override 
public void initialize(Bootstrap<AppConfiguration> bootstrap) { 
    super.initialize(bootstrap); 
    bootstrap.addBundle(
        new MigrationsBundle<AppConfiguration>() { 
         @Override 
         public DataSourceFactory getDataSourceFactory(
             AppConfiguration configuration) { 
          return configuration.getDataSourceFactory(); 
         } 
        }); 
} 

}

+0

बस मुख्य वर्ग का विस्तार करें, फिर परीक्षण-विशिष्ट सामग्री को काम करना चाहिए, मैं इस तरह से परीक्षण करने के लिए एच 2 इन-मेम डीबी में प्रवेश करता हूं – gli00001

संबंधित मुद्दे