TestNG 사용법

import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import javax.naming.Context; import javax.naming.InitialContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.transaction.HeuristicMixedException; import javax.transaction.HeuristicRollbackException; import javax.transaction.NotSupportedException; import javax.transaction.RollbackException; import javax.transaction.SystemException; import org.apache.log4j.Logger; import org.jboss.seam.mock.MockHttpServletRequest; import org.jboss.seam.mock.MockHttpServletResponse; import org.jboss.seam.mock.SeamTest; import org.testng.annotations.Test; public class MyTest extends SeamTest { static Logger logger = Logger.getLogger(MyTest.class); static { try { Context initContext = new InitialContext(); javax.transaction.UserTransaction transaction = new javax.transaction.UserTransaction() { @Override public void begin() throws NotSupportedException, SystemException { } @Override public void commit() throws RollbackException, HeuristicMixedException, HeuristicRollbackException, SecurityException, IllegalStateException, SystemException { } @Override public int getStatus() throws SystemException { return 0; } @Override public void rollback() throws IllegalStateException, SecurityException, SystemException { } @Override public void setRollbackOnly() throws IllegalStateException, SystemException { } @Override public void setTransactionTimeout(int arg0) throws SystemException { } }; initContext.bind(“/UserTransaction”, transaction); } catch (Exception e) { e.printStackTrace(); } } @Test(groups = { “Exception” }) public void case001() throws Throwable { new FacesRequest() { @Override protected HttpServletRequest createRequest() { MockHttpServletRequest req = (MockHttpServletRequest) super.createRequest(); try { // 아래와 같이 필요에 따라 Request 내용을 설정한다. // Mockito라는 라이브러리가 있지만 이미 생성된 인스턴스에 대해서는 불가능 Field f = req.getClass().getDeclaredField(“contextPath”); f.setAccessible(true); f.set(req, “/myapp”); } catch (Exception e) { e.printStackTrace(); } return req; } @Override protected void beforeRequest() { super.beforeRequest(); // request parameter 에 대해서는 여기에 설정 setParameter(“a”, “b”); } @Override protected void updateModelValues() throws Exception { // 인잭션이 필요한 컴포넌트는 여기에서 일단 생성 getInstance(“Seam컴포넌트”); } @Override protected void invokeApplication() throws Exception { // 테스트 내용을 여기에 기술 assert (체크내용); } }.run(); } } 위의 샘플소스는 JNDI를 사용하고 있다. Seam을 이용한다면 어쩔 수 없이 Transaction을 관리해주는데 그때문에 Transaction인스턴스를 JNDI에 bind해야 한다.

import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.naming.spi.InitialContextFactory;
public class MockInitialContextFactory implements InitialContextFactory {
	Context ic;
	public Context getInitialContext(Hashtable env) throws NamingException {
		if (ic == null) {
			System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory");
			System.setProperty(Context.URL_PKG_PREFIXES, "org.apache.naming");
			ic = new InitialContext();
		}
		return ic;
	}
}
그리고 또 한가지는 Seam Component 의 @Install(precedence=Install.MOCK) 을 적극이용하는 것이다. 실제 Seam Component의 클래스를 extends한후 Mock Component가 사용되도록 한다면 테스트가 쉬워질것이다. (물론 테스트 내용에 영향이 가지 않도록..) ]]>

Related Posts