2015-12-30 6 views
1

Я пытаюсь найти портативное решение для тестирования моего приложения Java EE 7. Особенно сложно проверить EJB и их инъекции. Например:Java EE 7 Переносное решение для тестирования интеграции и модуляции

@org.junit.Test 
    public void testIsValidCredentials() throws Exception { 
     System.out.println("isValidCredentials"); 
     String username = ""; 
     String password = ""; 

     Map properties = new HashMap(); 
     properties.put(EJBContainer.MODULES, new File[] {new File("target/classes")}); 

     EJBContainer container = javax.ejb.embeddable.EJBContainer.createEJBContainer(); 
     AuthenticatorLocal instance = (AuthenticatorLocal) container.getContext().lookup("java:global/classes/Authenticator"); 
     boolean expResult = false; 
     boolean result = instance.isValidCredentials(username, password); 
     assertEquals(expResult, result); 
     container.close(); 
    } 

Когда я запускаю тест я получаю: поставщик

Нет EJBContainer доступны

Я также попытался использовать опцию properties.put(EJBContainer.PROVIDER, ""), но не успех. Для Glassfish есть документация, но для Wildfly это действительно плохо.

Также я слышал о arquillian, но я вижу только пакеты Alpha, которые не выглядят безопасными для производства. Кто-нибудь знает портативное решение для (интеграции) тестирования?

+0

Вы считаете [Arquillian] (http://arquillian.org/)? –

ответ

0

Вот довольно стандартный подход, который я использую для выполнения тестов JUnit в среде Java EE.

Основная идея:

  1. Написать простое тестовое приложение с тестом Servlet и независимо от объекта EJB вы хотите проверить
  2. Используйте тестовый набор JavaSE JUnit для запуска сервера приложений, и диска GET запросы к испытательному сервлета
  3. Положите вашу фактическую тестовую логику в тестовом сервлета, таким образом, тестовая логика будет выполняющийся в среде Java EE

Вот иллюстрация ш шляпа, которая может выглядеть следующим образом:

Используйте набор JUnit SE с основными тестовых шлейфов для управления GET запросы к Вашему приложению:

@BeforeClass 
public static void oneTimeSetUp() { 
    // start my app server and make sure apps are installed 
} 

@AfterClass 
public static void oneTimeTearDown() { 
    // shut down app server 
} 

@Test 
public void testApplicationAvailable() { 
    runTestInServlet("testApplicationAvailable"); 
} 

@Test 
public void testThatFails() { 
    runTestInServlet("testThatFails"); 
} 

private void runTestInServlet(String testName) { 
    // Construct the URL, note that the name of the test is passed in 
    // as the value of the "test" parameter. This will get read from 
    // the servlet's doGet method 
    URL url = new URL("http://localhost:9080/myAppName/testServletName?test=" + test); 
    HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
    try{ 
     con.setRequestMethod("GET"); 
     InputStream is = con.getInputStream(); 
     InputStreamReader isr = new InputStreamReader(is); 
     BufferedReader br = new BufferedReader(isr); 

     // use the BufferedReader to validate response from test servlet 
     // i.e. search for some "successful test" token 
    } finally { 
     con.disconnect(); 
    } 
} 

Использование соответствующих методов в тестовом сервлета, чтобы выполнить реальное испытание в среда Java EE:

@WebServlet(name = "TestServlet", urlPatterns = { "/testServletName" }) 
public class TestServlet extends HttpServlet { 

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
     String test = request.getParameter("test"); 
     PrintWriter out = response.getWriter(); 

     try { 
      System.out.println("-----> " + test + " starting"); 
      // Use reflection to branch out and invoke the method found in the GET method's "test" parameter 
      getClass().getMethod(test, PrintWriter.class).invoke(this, response.getWriter()); 
      System.out.println("<----- " + test + " successful"); 
     } catch (Throwable x) { 
      System.out.println("<----- " + test + " failed:"); 
     } finally { 
      out.flush(); 
      out.close(); 
     } 
    } 

    public void testApplicationAvailable(PrintWriter pw) throws Exception { 
     System.out.prinln("Application and test servlet available"); 
    } 

    public void testThatFails(PrintWriter pw) throws Exception { 
     throw new Exception("This test will fail"); 
    } 
} 

есть ЛИЭС сторонних вы можете использовать, чтобы сделать это немного более простым, но это основная идея. Примеры, которые я показал здесь, могут быть выполнены со стандартными Java-библиотеками (и, конечно же, средой Java EE). Единственное, что здесь характерно для сервера приложений, на котором вы работаете, это логика запуска и останова сервера.

Кроме того, я слышал хорошие вещи о Аркиллиан, но в последнее время я слышал, что он поддерживается только для нескольких серверов приложений Java EE, что нарушит ваши требования к переносимости.

Смежные вопросы