[jboss-user] [JBoss Seam] - Seam and JUnit

dahm do-not-reply at jboss.com
Wed Oct 18 03:42:41 EDT 2006


Hi,

I tried to get Seam tests running with JUnit. As a first approach I took one
of the NG-Tests from the examples and tried to adapt it:


  | 
  | public class SeamTest extends TestCase {
  | 
  |   private MockExternalContext externalContext;
  |   private MockServletContext servletContext;
  |   private MockApplication application;
  |   private SeamPhaseListener phases;
  |   private MockFacesContext facesContext;
  |   private MockHttpSession session;
  |   private Map<String, ConversationState> conversationStates;
  |   
  | 	protected void setUp() throws Exception {
  | 		init();
  | 		begin();
  | 	}
  | 	 
  | 	protected void tearDown() throws Exception {
  | 		end();
  | 		cleanup();
  | 	}
  | 
  | 	public void testDefault() throws Exception {
  | 		new Script() {
  | 
  |       @Override
  |       protected void updateModelValues() throws Exception
  |       {
  |          User user = (User) Component.getInstance("user", true);
  |          assert user!=null;
  |          user.setUserName("1ovthafew");
  |          user.setPassword("secret");
  |          user.setRealName("Gavin King");
  |       }
  | 
  |       @Override
  |       protected void invokeApplication()
  |       {
  |       	LoginAction register = (LoginAction) Component.getInstance("login", true);
  |          String outcome = register.login();
  |          assert "success".equals( outcome );
  |       }
  | 
  |       @Override
  |       protected void renderResponse()
  |       {
  |          User user = (User) Component.getInstance("user", false);
  |          assert user!=null;
  |          assert user.getRealName().equals("Gavin King");
  |          assert user.getUserName().equals("1ovthafew");
  |          assert user.getPassword().equals(null);
  |       }
  |       
  |    }.run();
  | 	}
  | 	
  |   protected HttpSession getSession()
  |   {
  |      return (HttpSession) externalContext.getSession(true);
  |   }
  |   
  |   protected boolean isSessionInvalid()
  |   {
  |      return ( (MockHttpSession) getSession() ).isInvalid();
  |   }
  |   
  |   protected FacesContext getFacesContext()
  |   {
  |      return facesContext;
  |   }
  |   
  |   /**
  |    * Script is an abstract superclass for usually anonymous  
  |    * inner classes that test JSF interactions.
  |    * 
  |    * @author Gavin King
  |    */
  |   public abstract class Script
  |   {
  |      private String conversationId;
  |      private String outcome;
  |      private boolean validationFailed;
  |      
  |      /**
  |       * A script for a JSF interaction with
  |       * no existing long-running conversation.
  |       */
  |      protected Script() {}
  |      
  |      /**
  |       * A script for a JSF interaction in the
  |       * scope of an existing long-running
  |       * conversation.
  |       */
  |      protected Script(String id)
  |      {
  |         conversationId = id;
  |      }
  |      
  |      protected boolean isGetRequest()
  |      {
  |         return false;
  |      }
  |      
  |      protected String getViewId()
  |      {
  |         return null;
  |      }
  |      
  |      /**
  |       * Helper method for resolving components in
  |       * the test script.
  |       */
  |      protected Object getInstance(Class clazz)
  |      {
  |         return Component.getInstance(clazz, true);
  |      }
  | 
  |      /**
  |       * Helper method for resolving components in
  |       * the test script.
  |       */
  |      protected Object getInstance(String name)
  |      {
  |         return Component.getInstance(name, true);
  |      }
  |      
  |      /**
  |       * Override to implement the interactions between
  |       * the JSF page and your components that occurs
  |       * during the apply request values phase.
  |       */
  |      protected void applyRequestValues() throws Exception {}
  |      /**
  |       * Override to implement the interactions between
  |       * the JSF page and your components that occurs
  |       * during the process validations phase.
  |       */
  |      protected void processValidations() throws Exception {}
  |      /**
  |       * Override to implement the interactions between
  |       * the JSF page and your components that occurs
  |       * during the update model values phase.
  |       */
  |      protected void updateModelValues() throws Exception {}
  |      /**
  |       * Override to implement the interactions between
  |       * the JSF page and your components that occurs
  |       * during the invoke application phase.
  |       */
  |      protected void invokeApplication() throws Exception {}
  |      protected void setOutcome(String outcome) { this.outcome = outcome; }
  |      protected String getInvokeApplicationOutcome() { return outcome; }
  |      /**
  |       * Override to implement the interactions between
  |       * the JSF page and your components that occurs
  |       * during the render response phase.
  |       */
  |      protected void renderResponse() throws Exception {}
  |      /**
  |       * Override to set up any request parameters for
  |       * the request.
  |       */
  |      protected void setup() {}
  |      
  |      public Map<String, String[]> getParameters()
  |      {
  |         return ( (MockHttpServletRequest) externalContext.getRequest() ).getParameters();
  |      }
  |      
  |      public Map<String, String[]> getHeaders()
  |      {
  |         return ( (MockHttpServletRequest) externalContext.getRequest() ).getHeaders();
  |      }
  |      
  |      protected void validate(Class modelClass, String property, Object value)
  |      {
  |         ClassValidator validator = Validation.getValidator(modelClass);
  |         InvalidValue[] ivs = validator.getPotentialInvalidValues(property, value);
  |         if (ivs.length>0)
  |         {
  |            validationFailed = true;
  |            FacesMessage message = FacesMessages.createFacesMessage( FacesMessage.SEVERITY_WARN, ivs[0].getMessage() );
  |            FacesContext.getCurrentInstance().addMessage( property, /*TODO*/ message );
  |            FacesContext.getCurrentInstance().renderResponse();
  |         }
  |      }
  |      
  |      public boolean isValidationFailure()
  |      {
  |         return validationFailed;
  |      }
  |      
  |      @SuppressWarnings("unchecked")
  | 		public String run() throws Exception
  |      {   
  |         externalContext = new MockExternalContext(servletContext, session);
  |         facesContext = new MockFacesContext( externalContext, application );
  |         facesContext.setCurrent();
  |         Map attributes = facesContext.getViewRoot().getAttributes();
  |         
  |         if ( !isGetRequest() && conversationId!=null ) 
  |         {
  |            if ( conversationStates.containsKey( conversationId ) )
  |            {
  |               attributes.putAll(
  |                       conversationStates.get( conversationId ).state
  |                  );
  |            }
  |         }
  |                  
  |         setup();
  |         
  |         facesContext.getViewRoot().setViewId( getViewId() );
  | 
  |         phases.beforePhase( new PhaseEvent(facesContext, PhaseId.RESTORE_VIEW, MockLifecycle.INSTANCE) );
  |         phases.afterPhase( new PhaseEvent(facesContext, PhaseId.RESTORE_VIEW, MockLifecycle.INSTANCE) );
  | 
  |         if ( !isGetRequest() )
  |         {
  |         
  |            phases.beforePhase( new PhaseEvent(facesContext, PhaseId.APPLY_REQUEST_VALUES, MockLifecycle.INSTANCE) );
  |            
  |            applyRequestValues();
  |      
  |            phases.afterPhase( new PhaseEvent(facesContext, PhaseId.APPLY_REQUEST_VALUES, MockLifecycle.INSTANCE) );
  |            phases.beforePhase( new PhaseEvent(facesContext, PhaseId.PROCESS_VALIDATIONS, MockLifecycle.INSTANCE) );
  |            
  |            processValidations();
  |            
  |            phases.afterPhase( new PhaseEvent(facesContext, PhaseId.PROCESS_VALIDATIONS, MockLifecycle.INSTANCE) );
  | 
  |            if ( !FacesContext.getCurrentInstance().getRenderResponse() )
  |            {
  |         
  |               phases.beforePhase( new PhaseEvent(facesContext, PhaseId.UPDATE_MODEL_VALUES, MockLifecycle.INSTANCE) );
  |               
  |               updateModelValues();
  |         
  |               phases.afterPhase( new PhaseEvent(facesContext, PhaseId.UPDATE_MODEL_VALUES, MockLifecycle.INSTANCE) );
  |               phases.beforePhase( new PhaseEvent(facesContext, PhaseId.INVOKE_APPLICATION, MockLifecycle.INSTANCE) );
  |               
  |               invokeApplication();
  |               
  |               String outcome = getInvokeApplicationOutcome();
  |               facesContext.getApplication().getNavigationHandler().handleNavigation(facesContext, null, outcome);
  |         
  |               phases.afterPhase( new PhaseEvent(facesContext, PhaseId.INVOKE_APPLICATION, MockLifecycle.INSTANCE) );
  |               
  |            }
  |            
  |         }
  |         
  |         if ( !FacesContext.getCurrentInstance().getResponseComplete() )
  |         {
  |         
  |            phases.beforePhase( new PhaseEvent(facesContext, PhaseId.RENDER_RESPONSE, MockLifecycle.INSTANCE) );
  |            
  |            //TODO: hackish workaround for the fact that page actions don't get called!
  |            if ( isGetRequest() )
  |            {
  |               Lifecycle.setPhaseId(PhaseId.INVOKE_APPLICATION);
  |               invokeApplication();
  |               Lifecycle.setPhaseId(PhaseId.RENDER_RESPONSE);
  |            }
  |            
  |            renderResponse();
  |            
  |            facesContext.getApplication().getStateManager().saveSerializedView(facesContext);
  |            
  |            phases.afterPhase( new PhaseEvent(facesContext, PhaseId.RENDER_RESPONSE, MockLifecycle.INSTANCE ) );
  |            
  |         }
  | 
  |         Map pageContextMap = (Map) attributes.get( ScopeType.PAGE.getPrefix() );
  |         if (pageContextMap!=null)
  |         {
  |            conversationId = (String) pageContextMap.get(Manager.CONVERSATION_ID);
  |            ConversationState conversationState = new ConversationState();
  |            conversationState.state.putAll( attributes );
  |            conversationStates.put( conversationId, conversationState );
  |         }
  | 
  |         return conversationId;
  |      }
  |      
  |   }
  |   
  |   public void begin()
  |   {
  |      session = new MockHttpSession(servletContext);
  |   }
  | 
  |   public void end()
  |   {
  |      Lifecycle.endSession( servletContext, new ServletSessionImpl(session) );
  |      session = null;
  |   }
  |   
  |   /**
  |    * Create a SeamPhaseListener by default. Override to use 
  |    * one of the other standard Seam phase listeners.
  |    */
  |   protected SeamPhaseListener createPhaseListener()
  |   {
  | 	  return new SeamPhaseListener();
  |   }
  | 
  |   public void init() throws Exception
  |   {
  |      application = new MockApplication();
  |      application.setStateManager( new SeamStateManager( application.getStateManager() ) );
  |      application.setNavigationHandler( new SeamNavigationHandler( application.getNavigationHandler() ) );
  |      //don't need a SeamVariableResolver, because we don't test the view 
  |      phases = createPhaseListener();
  |      
  |      servletContext = new MockServletContext();
  |      initServletContext( servletContext.getInitParameters() );
  |      new Initialization(servletContext).init();
  |      Lifecycle.setServletContext(servletContext);
  | 
  |      conversationStates = new HashMap<String, ConversationState>();
  |   }
  | 
  |   public void cleanup() throws Exception
  |   {
  |      Lifecycle.endApplication(servletContext);
  |      externalContext = null;
  |      conversationStates.clear();
  |      conversationStates = null;
  |   }
  |   
  |   /**
  |    * Override to set up any servlet context attributes.
  |    */
  |   public void initServletContext(Map initParams) {}
  | 
  |   private class ConversationState
  |   {
  |      Map state = new HashMap();
  |   }
  |   
  |   protected InitialContext getInitialContext() throws NamingException {
  |      return Naming.getInitialContext();
  |   }
  |   
  |   protected UserTransaction getUserTransaction() throws NamingException
  |   {
  |      return Transactions.getUserTransaction();
  |   }
  |   
  |   protected Object getField(Object object, String fieldName)
  |   {
  |      try
  |      {
  |         Field declaredField = object.getClass().getDeclaredField(fieldName);
  |         if ( !declaredField.isAccessible() ) declaredField.setAccessible(true);
  |         return declaredField.get(object);
  |      }
  |      catch (Exception e)
  |      {
  |         throw new IllegalArgumentException("could not get field value: " + fieldName, e);
  |      }
  |   }
  | 
  |   protected void setField(Object object, String fieldName, Object value)
  |   {
  |      try
  |      {
  |         Field declaredField = object.getClass().getDeclaredField(fieldName);
  |         if ( !declaredField.isAccessible() ) declaredField.setAccessible(true);
  |         declaredField.set(object, value);
  |      }
  |      catch (Exception e)
  |      {
  |         throw new IllegalArgumentException("could not set field value: " + fieldName, e);
  |      }
  |   }
  | }
  | 

I'm not sure what's wrong with it, all I get is:


  | java.lang.AssertionError
  | 	at de.kvbb.ingver.test.SeamTest$1.updateModelValues(SeamTest.java:72)
  | 	at de.kvbb.ingver.test.SeamTest$Script.run(SeamTest.java:280)
  | 	at de.kvbb.ingver.test.SeamTest.testDefault(SeamTest.java:96)
  | 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  | 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  | 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  | 	at java.lang.reflect.Method.invoke(Method.java:585)
  | 	at junit.framework.TestCase.runTest(TestCase.java:154)
  | 	at junit.framework.TestCase.runBare(TestCase.java:127)
  | 	at junit.framework.TestResult$1.protect(TestResult.java:106)
  | 	at junit.framework.TestResult.runProtected(TestResult.java:124)
  | 	at junit.framework.TestResult.run(TestResult.java:109)
  | 	at junit.framework.TestCase.run(TestCase.java:118)
  | 	at junit.framework.TestSuite.runTest(TestSuite.java:208)
  | 	at junit.framework.TestSuite.run(TestSuite.java:203)
  | 	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
  | 	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
  | 	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
  | 

Thanks in advance
  Markus

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3978994#3978994

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3978994



More information about the jboss-user mailing list