पर आर्किलीयन का उपयोग करते समय दो बार तरीकों का आह्वान करते हैं हम रिमोट सर्वर के साथ आर्किलीयन का उपयोग करने के लिए एम्बेडेड जेबॉस के साथ टेस्टएनजी का उपयोग करने से संक्रमण कर रहे हैं।@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
अब तक पर चलाया जाता है, '@ BeforeClass' Arquillian परीक्षण के लिए ग्राहक पर ही चलते हैं के लिए है। लेकिन यह एक बग की तरह दिखता है। क्या आप इस प्रश्न को अपने कोड से अपडेट कर सकते हैं? नोट: [एआरक्यू -351] (https://issues.jboss.org/browse/ARQ-351) जीवन चक्र घटनाओं के निष्पादन के लिए नियंत्रण लाएगा। –
@VineetReynolds, कोड बहुत आसान है। मैं एक स्निपेट पोस्ट करूंगा। यदि भविष्य में अपेक्षित व्यवहार केवल कंटेनर के बाहर "@BeforeClass" चलाया जाता है, तो मैं एक विधि को कैसे एनोटेट कर सकता हूं जो इसे कंटेनर में चलाने के लिए प्रेरित करेगा लेकिन उस वर्ग के सभी परीक्षणों से पहले? –
इसके अलावा, @ विनीत रेनॉल्ड्स, यदि आप अपनी टिप्पणी के बजाय उत्तर पोस्ट करना चाहते हैं और वैकल्पिक समाधान शामिल करते हैं तो आप क्रेडिट प्राप्त कर सकते हैं, कृपया करें। –