2012-04-19 16 views
7

पर आर्किलीयन का उपयोग करते समय दो बार तरीकों का आह्वान करते हैं हम रिमोट सर्वर के साथ आर्किलीयन का उपयोग करने के लिए एम्बेडेड जेबॉस के साथ टेस्टएनजी का उपयोग करने से संक्रमण कर रहे हैं।@BeforeClass एनोटेशन रिमोट सर्वर

हम एक साधारण परीक्षण चला रहे हैं जिसमें @BeforeClass के साथ एनोटेटेड विधि है जो कुछ परीक्षण सेटअप करता है। खुदाई के बाद, ऐसा लगता है कि सेटअप विधि को दो बार बुलाया जा रहा है: एक बार कंसोल पर जहां हम परीक्षण को चलाने के लिए हमारे मेवेन कमांड को निष्पादित कर रहे हैं और फिर जब हमारे दूरस्थ सर्वर पर परीक्षण युद्ध तैनात किया जाता है और परीक्षण चलता है। ये दो अलग जेवीएमएस हैं - एक कंटेनर के बाहर चल रहा है और दूसरा कंटेनर के अंदर चल रहा है। मेरी वरीयता सिर्फ बाद के रन है।

क्या यह व्यवहार मुझे उम्मीद करनी चाहिए या क्या मुझे कुछ याद आ रही है?

अभी के लिए, हम वास्तव में यह देखने के लिए जांच कर रहे हैं कि हम कंटेनर में हैं या नहीं, और यदि ऐसा है, तो हम अपना सेटअप कोड चलाते हैं। यह काम करता है लेकिन मैं जानना चाहता हूं कि कोई बेहतर तरीका है या नहीं।

हमारे कोड के कुछ स्निपेट (कृपया कोड की सादगी को अनदेखा करें और तथ्य यह है कि सेटअप कॉम्पोनेंट्स विधि की वास्तव में आवश्यकता नहीं है, वहां बहुत जटिल परीक्षण हैं जिन्हें हम माइग्रेट कर रहे हैं जिन्हें इस कार्यक्षमता की आवश्यकता होगी):

कंसोल से जहां mvn निष्पादित किया जा रहा है::

public class BaseTest extends Arquillian 
{ 
    private static Log log = LogFactory.getLog(SeamTest.class); 

    @Deployment 
    public static Archive<?> createDeployment() 
    { 
     // snip... basically, we create a test war here 
    } 

    /** 
    * todo - there might be a better way to do this 
    */ 
    private boolean runningInContainer() 
    { 
     try 
     { 
      new InitialContext().lookup("java:comp/env"); 
      return true; 
     } 
     catch (NamingException ex) 
     { 
      return false; 
     } 
    } 

    @BeforeClass 
    public void setupOnce() throws Exception 
    { 
     getLog().debug("in setupOnce(): " + runningInContainer()); 
     if (runningInContainer()) 
     { 
      new ComponentTest() 
      { 
       protected void testComponents() throws Exception 
       { 
        setupComponents(); 
       } 
      }.run(); 
     } 
    } 

    public User createUser() 
    { 
     // ... 
    } 

    public Log getLog() 
    { 
     // snip... 
    } 

    public UserDao getUserDao() 
    { 
     // ... 
    } 

    public abstract class ComponentTest 
    { 
     protected abstract void testComponents() throws Exception; 

     public void run() throws Exception 
     { 
      try { 
       testComponents(); 
      } finally { 

      } 
     } 
    } 

} 

public class UserDaoTest extends BaseTest 
{ 
    UserDao userDao; 

    @Override 
    protected void setupComponents() 
    { 
     getLog().debug("in setupComponents: " + runningInContainer()); 
     userDao = getUserDao(); 
    } 

    @Test 
    public void testGetUser() throws Exception 
    { 
     getLog().debug("in testGetUser: " + runningInContainer()); 

     new ComponentTest() 
     { 
      protected void testComponents() throws Exception 
      { 
       User user0 = createUser(); 
       user0.setName("frank"); 

       userDao.merge(user0); 

       User retrievedUser = userDao.findByName("frank"); 
       assertNotNull(retrievedUser); 
      } 

     }.run(); 
    } 

} 

यह मूलतः मुझे उत्पादन है कि इस तरह दिखता है देता है

in setupOnce(): false 

Jboss सर्वर से:

in setupOnce(): true 
in setupComponents: true 
in testGetUser: true 
+0

अब तक पर चलाया जाता है, '@ BeforeClass' Arquillian परीक्षण के लिए ग्राहक पर ही चलते हैं के लिए है। लेकिन यह एक बग की तरह दिखता है। क्या आप इस प्रश्न को अपने कोड से अपडेट कर सकते हैं? नोट: [एआरक्यू -351] (https://issues.jboss.org/browse/ARQ-351) जीवन चक्र घटनाओं के निष्पादन के लिए नियंत्रण लाएगा। –

+0

@VineetReynolds, कोड बहुत आसान है। मैं एक स्निपेट पोस्ट करूंगा। यदि भविष्य में अपेक्षित व्यवहार केवल कंटेनर के बाहर "@BeforeClass" चलाया जाता है, तो मैं एक विधि को कैसे एनोटेट कर सकता हूं जो इसे कंटेनर में चलाने के लिए प्रेरित करेगा लेकिन उस वर्ग के सभी परीक्षणों से पहले? –

+0

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

उत्तर

5

यह "अपेक्षित" व्यवहार है। वास्तव में अच्छा नहीं है, लेकिन यह है कि कैसे Arqullian काम करता है।

JUnit

  • @BeforeClass/@AfterClass केवल clientside पर क्रियान्वित कर रहे हैं
  • परीक्षण वर्ग की राज्य, @Test के बीच खो दिया है कंटेनर में पूरे जीवन चक्र प्रत्येक परीक्षा के लिए दोहराया है
  • @Before/@After runmode के आधार पर क्रियान्वित कर रहे हैं (क्लाइंट/सर्वर)

TestNG

  • सब कुछ दोनों सर्वर और ग्राहक
+0

पोस्ट के बाद, यह मूल रूप से आर्किलीयन टीम से मिली प्रतिक्रिया है।कुछ खुले हैं (इस बिंदु पर) आर्किलीयन मुद्दे जो इसे कवर करते हैं: https://issues.jboss.org/browse/ARQ-567 https://issues.jboss.org/browse/ARQ-197 –