2013-08-16 8 views
9

के साथ जर्सीटेस्ट कंटेनर से प्रबंधित बीन पुनर्प्राप्त करें यह प्रश्न पिछले प्रश्न Specify Custom Application Context से एक अनुवर्ती है।जर्सी-वसंत 3

हम जर्सी-वसंत 3 का जर्सी-वसंत 3 का उपयोग कर जर्सी-वसंत में जर्सी 2.x का उपयोग कर जर्सी 1.x से हमारी कुछ डेटा सेवाओं को माइग्रेट कर रहे हैं।

हमारे पास कुछ परीक्षण कक्षाएं हैं जो जर्सीटेस्ट से प्राप्त होती हैं। इनमें से कुछ कक्षाएं कस्टम अनुप्रयोग Context.xml फ़ाइलों का उपयोग करती हैं जो web.xml फ़ाइल में निर्दिष्ट नहीं हैं।

ऑब्जेक्ट मॉकिंग उद्देश्यों के लिए हम अपने जर्सी संसाधनों में कुछ घटकों का मज़ाक उड़ाएंगे।

जर्सी 1.x में हम से

<bean id="mockBean" class="org.easymock.EasyMock" 
    factory-method="createStrictMock" autowire="byName"> 
    <constructor-arg index="0" value="com.xxx.xxx.ClassToMock" /> 
</bean> 

आवेदन संदर्भ फ़ाइल में वस्तुओं नकली और के रूप में

ClassToMock obj = (ClassToMock)ContextLoader 
    .getCurrentWebApplicationContext() 
    .getAutowireCapableBeanFactory() 
    .getBean("mockBean"); 

इस प्रकार कैसे एक ही जर्सी 2 के साथ प्राप्त किया जा सकता इन मज़ाक उड़ाया उदाहरणों को पुनः प्राप्त कर सकते हैं। जर्सी-वसंत 3 का उपयोग कर एक्स?

मैंने API docs, user guides और sources में से कुछ को कॉम्बेड किया है लेकिन उत्तर पाने में असमर्थ था।

धन्यवाद।

संपादित करें:

हम अपने JAX-आरएस संसाधनों के अंदर मज़ाक उड़ाया सेम का उपयोग किया जाएगा। हमारे पास सेवा इंटरफेस हैं जो हमारे संसाधनों में @Autowired हैं।

उदा।

@Path(ProductResource.RESOURCE_PATH) 
@Component 
@Scope("prototype") 
public class ProductResource 
extends GenericResource<Product, BaseModel> { 

    /* 
    * Members 
    */ 

    public static final String RESOURCE_PATH = "product/"; 

    @Autowired 
    protected ProductService productService; 

    ... 

हम इन सेवाओं पर अपेक्षाओं को देखना चाहते हैं और सेट करना चाहते हैं।

उदा।

<bean id="productService" class="org.easymock.EasyMock" 
    factory-method="createStrictMock"> 
    <constructor-arg index="0" 
     value="com.xxx.xxx.service.ProductService" /> 
</bean> 
+0

क्या आप इसे एक उदाहरण पर चित्रित कर सकते हैं? (आप कैसे/कब/कहां मॉक बीन का उपयोग कर रहे हैं? क्या यह एक जेएक्स-आरएस संसाधन के अंदर है?) क्या आपको बिल्कुल 'WebAplicationContext' या किसी' ApplicationContext' की आवश्यकता है? –

+0

या तो 'WebAplicationContext' या' ApplicationContext' ठीक होगा। जो भी हमें बीन को एक सूचक देता है जिसे जेएक्स-आरएस संसाधनों में इंजेक्शन दिया गया था। –

उत्तर

8

नोट: मैं एक स्प्रिंग विशेषज्ञ नहीं हूँ और मैं इस एक सिफारिश की दृष्टिकोण के बजाय एक काम के आसपास मानते हैं। उम्मीद है कि कोई बेहतर समाधान के साथ आएगा।

आप ContextLoader#getCurrentWebApplicationContext() बुला क्योंकि जर्सी 2.x क्रम डिफ़ॉल्ट जब इकाई/E2E परीक्षण के लिए जर्सी टेस्ट फ्रेमवर्क (JerseyTest) का उपयोग कर एक सर्वलेट कंटेनर के बाहर प्रारंभ कर रहा है द्वारा एक ApplicationContext उदाहरण प्राप्त नहीं कर सकता।एक बार जब आप इस वर्ग है

public class ApplicationContextUtils implements ApplicationContextAware { 

    private static ApplicationContext applicationContext; 

    public static ApplicationContext getApplicationContext() { 
     return applicationContext; 
    } 

    @Override 
    public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException { 
     ApplicationContextUtils.applicationContext = applicationContext; 
    } 
} 

, मत भूलना यह उल्लेख करने के लिए:

इस मामले में आप अपने परीक्षण पैकेज में एक ApplicationContextAware इंटरफेस को लागू करने से एक ApplicationContext प्राप्त करने के लिए चारों ओर काम एक छोटे से उपयोग करने की आवश्यकता आपके आवेदन संदर्भ डिस्क्रिप्टर में:

... 
<bean class="org.glassfish.jersey.examples.helloworld.spring.ApplicationContextUtils" /> 
... 

और आप अपने परीक्षण में इसका इस्तेमाल कर सकते हैं:

public class JerseySpringResourceTest extends JerseyTest { 

    // ... Configure ... 

    @Before 
    public void mockUp() throws Exception { 
     // ApplicationContext is ready in your @Before methods ... 
     assertThat(ApplicationContextUtils.getApplicationContext(), notNullValue()); 
    } 

    @Test 
    public void testJerseyResource() { 
     // ... as well as in your test methods. 
     assertThat(ApplicationContextUtils.getApplicationContext(), notNullValue()); 
    } 
} 

नोट: आप एक सर्वलेट कंटेनर के लिए आपके आवेदन को तैनात है और यह के खिलाफ अपने (JerseyTest) परीक्षण चलाने के लिए उपयोगकर्ता गाइड में Jersey Test Framework अध्याय (विशेष रूप से External container अनुभाग) से परामर्श करें।

+0

प्रतिक्रिया के लिए धन्यवाद। जैसे ही मैं कर सकता हूं मैं इसे एक परीक्षा दूंगा। सिर्फ एक प्रश्न। 'Set.plplicationContext = applicationContext' में 'set.plplicationContext'' नहीं होना चाहिए, बल्कि 'ApplicationContextUtils.applicationContext = applicationContext;' के रूप में देखकर अनुप्रयोग कॉन्टेक्स्ट एक स्थिर क्षेत्र है। –

+0

हाँ, निश्चित। धन्यवाद। –

+1

कोई भी एप्लिकेशनकॉन्टेक्स्ट उपयोग पर '@ कॉम्पोनेंट' एनोटेशन का उपयोग कर सकता है (यह सुनिश्चित करना कि यह एक पैकेज के भीतर है जो घटक-स्कैन किया गया है), जिससे बीन स्पष्ट रूप से घोषित करने की आवश्यकता को छोड़ दिया जा सके। –

1

जर्सी 2.X उपयोगकर्ताओं के लिए, यहाँ क्या मेरे लिए काम किया है:

public class AccountResourceTest extends JerseyTest { 

    private ApplicationContext context; 

    private BeanA beanA; 

    private BeanB beanB; 

    public AccountResourceTest() throws TestContainerException { 
     super(); 

     beanA = context.getBean(BeanA.class); 
     beanB = context.getBean(BeanB.class); 
    } 

    @Override 
    protected Application configure() { 
     context = new AnnotationConfigApplicationContext(SpringConfiguration.class); 
     final ResourceConfig config = new JerseyConfiguration().property("contextConfig", context); 
     return config; 
    } 

    @Override 
    protected void configureClient(final ClientConfig config) { 
     config.register(JacksonJsonProvider.class); 
    } 

    ... 
} 

यह रूप में अच्छी तरह संदर्भ में मेरी जर्सी परीक्षण के लिए JavaConfig उपयोग करने के लिए, और का उपयोग सेम की अनुमति देता है मुझे। http://geowarin.github.io/spring-boot/jersey/2014/01/31/a-simple-spring-boot-and-jersey-application.html

1
जर्सी संस्करण 2.4.x के साथ

, वर्ग JerseyConfiguration अब मौजूद नहीं है और ResourceConfig जो contextConfig संपत्ति नहीं समझती ने ले लिया है: यहाँ मैं कहाँ विचार आया के लिए लिंक है। यहां मेरा समाधान है:

package ch.vd.test; 

import java.net.URI; 

import javax.ws.rs.core.Application; 

import org.glassfish.hk2.api.ServiceLocator; 
import org.glassfish.jersey.server.ApplicationHandler; 
import org.glassfish.jersey.server.ResourceConfig; 
import org.glassfish.jersey.test.JerseyTest; 
import org.glassfish.jersey.test.grizzly.GrizzlyTestContainerFactory; 
import org.glassfish.jersey.test.spi.TestContainer; 
import org.glassfish.jersey.test.spi.TestContainerException; 
import org.glassfish.jersey.test.spi.TestContainerFactory; 
import org.junit.Test; 
import org.springframework.context.ApplicationContext; 

public class ExampleTest extends JerseyTest { 

    private ServiceLocator serviceLocator; 

    @Override 
    public void setUp() throws Exception { 
     super.setUp(); 
     final ApplicationContext context = serviceLocator.getService(ApplicationContext.class, "SpringContext"); 
     final Object bean = context.getBean("someBean"); 
    } 

    @Override 
    protected Application configure() { 
     final ResourceConfig config = new ResourceConfig(RestResources.class); 
     config.property("contextConfigLocation", "classpath:example-context.xml"); 
     return config; 
    } 

    @Override 
    protected TestContainerFactory getTestContainerFactory() throws TestContainerException { 
     return new GrizzlyTestContainerFactory() { 
      @Override 
      public TestContainer create(URI uri, ApplicationHandler appHandler) throws IllegalArgumentException { 
       serviceLocator = appHandler.getServiceLocator(); 
       return super.create(uri, appHandler); 
      } 
     }; 
    } 

    @Test 
    public void testStuff() throws Exception { 
     ... 
    } 
} 
3

यदि आप इसके लिए कोई आपत्ति नहीं करते हैं तो आप जर्सी संदर्भ में अपनी परीक्षा कक्षा इंजेक्ट कर सकते हैं।

उदाहरण के लिए:

@Override 
protected Application configure() { 
    final TestJerseyApplication application = new TestJerseyApplication(); 

    final Map<String, Object> properties = new HashMap<>(); 
    properties.put("contextConfigLocation", "classpath:test-spring-context.xml"); 
    application.setProperties(properties); 

    application.register(this); 
    return application; 
} 

उसके बाद @Autowired एनोटेशन आप के लिए काम करेंगे।

+0

आह, हम जर्सी को बता सकते हैं कि डिफ़ॉल्ट 'applicationContext.xml' नाम की बजाय "संदर्भ कॉन्फिग्लोकेशन" के माध्यम से देखने के लिए कस्टम स्प्रिंग संदर्भ फ़ाइल क्या है। – jediz

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