2010-12-02 15 views
8

मैं जर्सी से शुरुआत कर रहा हूं और टीडीडी का उपयोग कर फ्रीमार्कर के साथ काम करने की कोशिश कर रहा हूं। मैं अपने टेम्पलेट्स के लिए ViewProcessor बनाना चाहता हूं, लेकिन कक्षा में सर्वलेट संदर्भ इंजेक्ट करने में विफल रहता हूं। यहाँजर्सी परीक्षण ढांचे का उपयोग करते समय सर्वलेट संदर्भ इंजेक्शन विफल रहा

@Provider 
public class myProcessor implements ViewProcessor<Template> { 

    [...] 

    @Context 
    public ServletContext myContext; 

    [...] 

freemarkerConfiguration.setTemplateLoader(
     new WebappTemplateLoader(myContext, 
      myContext.getInitParameter("freemarker.template.path"))); 

    [...] 
    } 

और परीक्षण कोड है::

यहाँ वर्ग कोड है

public class myProcessorTest extends JerseyTest { 

    public static myProcessor mp; 

    public myProcessorTest() throws Exception{ 
     super(new WebAppDescriptor.Builder("com.domain").build()); 
    } 

    @Test 
    public void firstTest(){ 
     mp = new myProcessor(); 
     String path = new String("test.ftl"); 
     Template template = mp.resolve(path); 
     assertNotNull(template); 
    } 
} 

मैं पालन निर्भरता के साथ Maven का उपयोग करें:

<dependency> 
    <groupId>com.sun.jersey.jersey-test-framework</groupId> 
    <artifactId>jersey-test-framework-grizzly</artifactId> 
    <version>1.5-SNAPSHOT</version> 
    <scope>test</scope> 
</dependency> 

मेरे कोड ठीक चलाता है जब मैं अपने स्थानीय जेटी सर्वर पर तैनात करता हूं। myContextnull है जब मैं परीक्षण चलाएँ:: लेकिन अगर मैं अपने आईडीई में कोड का परीक्षण करना चाहते हैं, यह सर्वलेट संदर्भ (@Context) इंजेक्षन करने में विफल रहा/

मुझे लगता है कि मैं कुछ याद कर रहा हूँ, लेकिन मुझे एक कर रहा हूँ सर्वलेट दुनिया के साथ पूर्ण शुरुआत।

उत्तर

0

ऐसा करने के कुछ तरीके हैं। निर्माता निकालें और इस तरह एक कॉन्फ़िगर() विधि को लागू:

public class myProcessorTest extends JerseyTest { 

    public static myProcessor mp; 

    @Override 
    protected AppDescriptor configure() { 
    return new WebAppDescriptor.Builder("com.domain") 
     .contextParam("contextConfigLocation", "classpath:/applicationContext.xml") 
     .contextPath("/").servletClass(SpringServlet.class) 
     .contextListenerClass(ContextLoaderListener.class) 
     .requestListenerClass(RequestContextListener.class) 
     .build(); 
    } 

या वैकल्पिक रूप से आप वसंत संदर्भ के साथ अपने परीक्षण टिप्पणी कर सकते हैं:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("classpath:applicationContext.xml") 
public class MyProcessorTest extends JerseyTest { 

    public static myProcessor mp; 
0

इस समस्या यह है कि आवश्यकता नहीं है के लिए एक समाधान है वसंत, मानते हुए कि आप डिफ़ॉल्ट/मानक Grizzy2 परीक्षण ढांचे प्रदाता का उपयोग कर रहे हैं। this answer के अनुसार jersey-test-framework-provider-grizzly2 ढांचा प्रदाता अनुप्रयोग संदर्भ बनाने में सर्वलेट पर्यावरण का उपयोग नहीं करता है। आपके लक्षण इंजेक्ट करने के लिए ServletContext उदाहरण होने के परिणामस्वरूप होते हैं।

वर्कअराउंड यूनिट परीक्षणों के लिए परीक्षण कंटेनर प्रदान करना है।

<!--<dependency> 
    <groupId>org.glassfish.jersey.test-framework.providers</groupId> 
    <artifactId>jersey-test-framework-provider-grizzly2</artifactId> 
    <version>2.25</version> 
    <scope>test</scope> 
</dependency>--> 
<dependency> 
    <groupId>org.glassfish.jersey.test-framework</groupId> 
    <artifactId>jersey-test-framework-core</artifactId> 
    <version>2.25</version> 
</dependency> 
<dependency> 
    <groupId>org.glassfish.jersey.containers</groupId> 
    <artifactId>jersey-container-grizzly2-servlet</artifactId> 
    <version>2.25</version> 
</dependency> 

फिर, एक Grizzy सर्वलेट कंटेनर प्रदान करने के लिए अपने परीक्षण संशोधित: पहले, अपने निर्भरता को संशोधित

@Override 
protected TestContainerFactory getTestContainerFactory() throws TestContainerException { 
    return (final URI baseUri, final DeploymentContext deploymentContext) -> 
    new TestContainer() { 
    private HttpServer server = null; 

    @Override 
    public ClientConfig getClientConfig() { 
     return null; 
    } 

    @Override 
    public URI getBaseUri() { 
     return baseUri; 
    } 

    @Override 
    public void start() { 
     try { 
     this.server = GrizzlyWebContainerFactory.create(baseUri, Collections 
      .singletonMap("jersey.config.server.provider.packages", "<your-package-name>")); 
     } catch (final ProcessingException | IOException cause) { 
     throw new TestContainerException(cause); 
     } 
    } 

    @Override 
    public void stop() { 
     this.server.shutdownNow(); 
    } 
    }; 
} 

मुझे लगता है कि आप एक से अधिक इकाई परीक्षण में इस का उपयोग करने जा रहे हैं, तो यह हो सकता है JerseyTest का विस्तार करने के लिए बुद्धिमानी, इसलिए यह सामान्य कॉन्फ़िगरेशन स्वचालित रूप से किया जा सकता है। इसके अतिरिक्त, यह देखने के लिए org.glassfish.jersey.test.grizzly.GrizzlyTestContainerFactory की समीक्षा करने योग्य हो सकता है कि परीक्षण कंटेनर द्वारा प्रदान की गई कोई कार्यक्षमता है जिसे आप अनुकरण/संरक्षित करना चाहते हैं। प्रदान किया गया उदाहरण कम से कम पुष्टि करने के लिए आपके परीक्षण में गिरा दिया जाना चाहिए यह एक फिक्स है।

संपादित करें: अपने स्वयं के कार्यान्वयन में, मुझे सर्वर उत्पन्न करते समय अभी भी ResourceConfig की आपूर्ति करने की क्षमता की आवश्यकता है। मुझे संदेह है कि यह अन्य जर्सी टेस्ट फ्रेमवर्क उपयोगकर्ताओं के लिए आम मामला होने की संभावना है। प्रस्तावित TestContainerFactory का एक कार्य उदाहरण निम्नानुसार है।

import java.io.IOException; 
import java.net.URI; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

import javax.servlet.ServletContext; 
import javax.ws.rs.ProcessingException; 
import javax.ws.rs.core.UriBuilder; 

import org.glassfish.grizzly.http.server.HttpServer; 
import org.glassfish.grizzly.servlet.WebappContext; 
import org.glassfish.hk2.utilities.binding.AbstractBinder; 
import org.glassfish.jersey.client.ClientConfig; 
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory; 
import org.glassfish.jersey.test.DeploymentContext; 
import org.glassfish.jersey.test.spi.TestContainer; 
import org.glassfish.jersey.test.spi.TestContainerException; 
import org.glassfish.jersey.test.spi.TestContainerFactory; 
import org.glassfish.jersey.test.spi.TestHelper; 


public class RestTestContainerFactory implements TestContainerFactory {  
    public static class RestTestContainer implements TestContainer { 
    private static final Logger LOGGER = Logger.getLogger(RestTestContainer.class.getName()); 

    private URI baseUri = null; 
    private final HttpServer server; 

    public RestTestContainer(final URI baseUri, final DeploymentContext context) { 
     this.baseUri = UriBuilder.fromUri(baseUri).path(context.getContextPath()).build(); 
     if(LOGGER.isLoggable(Level.INFO)) { 
     LOGGER.info("Creating RestRestContainer configured at the base URI "+TestHelper.zeroPortToAvailablePort(baseUri)); 
     } 

     try { 
     final WebappContext webContext = new WebappContext("TestContext", context.getContextPath()); 
     context.getResourceConfig() 
       .register(new AbstractBinder() { 
       @Override 
       protected void configure() { 
        bind(webContext).to(ServletContext.class); 
       } 
       }); 
     this.server = GrizzlyHttpServerFactory.createHttpServer(this.baseUri, context.getResourceConfig(), false); 
     webContext.deploy(this.server); 

     } catch (final ProcessingException cause) { 
     throw new TestContainerException(cause); 
     } 
    } 

    @Override 
    public ClientConfig getClientConfig() { 
     return null; 
    } 

    @Override 
    public URI getBaseUri() { 
     return baseUri; 
    } 

    @Override 
    public void start() { 
     if(server.isStarted()) { 
     LOGGER.warning("Ignoring start request - RestTestContainer is already started"); 
     } else { 
     LOGGER.fine("Starting RestTestContainer..."); 
     try { 
      server.start(); 
      if(baseUri.getPort() == 0) { 
      baseUri = UriBuilder.fromUri(baseUri) 
       .port(server.getListener("grizzly").getPort()) 
       .build(); 
      LOGGER.info("Started GrizzlyTestContainer at the base URI "+baseUri); 
      } 
     } 
     catch(final ProcessingException | IOException cause) { 
      throw new TestContainerException(cause); 
     } 
     } 
    } 

    @Override 
    public void stop() { 
     if(server.isStarted()) { 
     LOGGER.fine("Stopping RestTestContainer..."); 
     server.shutdownNow(); 
     } else { 
     LOGGER.warning("Ignoring stop request - RestTestContainer is already stopped"); 
     } 
    } 
    } 

    @Override 
    public TestContainer create(final URI baseUri, final DeploymentContext context) { 
    return new RestTestContainer(baseUri,context); 
    } 
} 

Frustratingly, ग्रिजली के GrizzlyWebContainerFactory एक सर्वलेट संदर्भ प्रदान करेगा, लेकिन एक संसाधन config के साथ कॉन्फ़िगर नहीं। उलटा, GrizzlyHttpServerFactoryResourceConfig के साथ एक एप्लिकेशन को कॉन्फ़िगर करेगा, लेकिन एक वेब संदर्भ प्रदान नहीं करेगा।

हम बनाने WebappContext (ServletContext फैली) मैन्युअल रूप से, यह विन्यस्त करने, और फिर संसाधन config में एक AbstractBinder के माध्यम से यह इंजेक्शन लगाने के द्वारा इस के आसपास काम कर सकते हैं।

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