Package org.springmodules.orm.orbroker

Source Code of org.springmodules.orm.orbroker.BrokerFactoryBeanTests

/*
* Copyright 2002-2006 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.springmodules.orm.orbroker;

import junit.framework.TestCase;
import net.sourceforge.orbroker.Broker;
import net.sourceforge.orbroker.BrokerException;
import net.sourceforge.orbroker.Executable;
import org.easymock.MockControl;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springmodules.orm.orbroker.support.BrokerDaoSupport;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
* BrokerFactoryBean Tests.
*
* @author Omar Irbouh
* @since 2005.06.03
*/
public class BrokerFactoryBeanTests extends TestCase {

  public void testBrokerFactoryWithNullDataSource() {
    BrokerFactoryBean factory = new BrokerFactoryBean();
    try {
      factory.afterPropertiesSet();
      fail("Should have thrown IllegalArgumentException");
    } catch (IllegalArgumentException e) {
      // expected
    } catch (Exception e) {
      fail("Exception not expected " + e);
    }
  }

  public void testBrokerFactoryWithNullConfigLocation() throws SQLException, IOException {
    // prepare mock objects
    MockControl dsControl = MockControl.createControl(DataSource.class);
    DataSource ds = (DataSource) dsControl.getMock();

    //needed for orbroker internal since I can not mock ORBroker classes
    prepareNewBrokerInternals(dsControl, ds);

    dsControl.replay();

    // run scenario
    BrokerFactoryBean factory = new BrokerFactoryBean();
    factory.setDataSource(ds);
    factory.afterPropertiesSet();

    dsControl.verify();
  }

  public void testBrokerFactoryWithConfigNotFound() {
    MockControl dsControl = MockControl.createControl(DataSource.class);
    BrokerFactoryBean factory = new BrokerFactoryBean();
    factory.setDataSource((DataSource) dsControl.getMock());
    factory.setConfigLocation(new ClassPathResource("path/not-found.xml"));
    try {
      factory.afterPropertiesSet();
      fail("Should have thrown IOException");
    } catch (IOException e) {
      // expected
    }
  }

  public void testBrokerTemplate() throws SQLException, IOException {
    // prepare mock objects
    MockControl dsControl = MockControl.createControl(DataSource.class);
    DataSource ds = (DataSource) dsControl.getMock();

    MockControl conControl = MockControl.createControl(Connection.class);
    Connection con = (Connection) conControl.getMock();

    //needed for orbroker internal since I can not mock ORBroker classes
    prepareNewBrokerInternals(dsControl, ds);

    ds.getConnection();
    dsControl.setReturnValue(con);

    //needed for orbroker internal since I can not mock ORBroker classes
    prepareObtainExecutableInternals(conControl, con);

    con.close();
    conControl.setVoidCallable(1);

    dsControl.replay();
    conControl.replay();

    // run scenario
    Resource config = new ClassPathResource("org/springmodules/orm/orbroker/broker.xml");
    Broker broker = new Broker(config.getInputStream(), ds);
    BrokerTemplate brokerTemplate = new BrokerTemplate();
    brokerTemplate.setBroker(broker);
    brokerTemplate.afterPropertiesSet();

    Object result = brokerTemplate.execute(new BrokerCallback() {
      public Object doInBroker(Executable executable) throws BrokerException {
        return "done";
      }
    });

    assertEquals("result should be [done]", "done", result);

    dsControl.verify();
    conControl.verify();
  }

  public void testBrokerDaoSupport() throws Exception {
    // prepare mock objects
    MockControl dsControl = MockControl.createControl(DataSource.class);
    DataSource ds = (DataSource) dsControl.getMock();

    //needed for orbroker internal since I can not mock ORBroker classes
    prepareNewBrokerInternals(dsControl, ds);

    dsControl.replay();

    BrokerTemplate template = new BrokerTemplate();
    Broker broker = new Broker(ds);
    template.setBroker(broker);
    assertEquals(broker, template.getBroker());

    BrokerDaoSupport testDao = new BrokerDaoSupport() {
    };
    testDao.setBrokerTemplate(template);
    assertEquals(template, testDao.getBrokerTemplate());

    testDao.afterPropertiesSet();
    dsControl.verify();
  }

  /**
   * This method may be updated when upgrading ORBroker to a newer version.
   * ORBroker does not use interfaces, and its main classes are final with a package scope visibility!!!
   * I found noway to mock ORBroker classes!!! jmock / cglib does not support final classes
   *
   * @param dsControl DataSource mock control
   * @param ds    DataSource mock
   * @throws SQLException
   */
  protected void prepareNewBrokerInternals(MockControl dsControl, DataSource ds) throws SQLException {
    MockControl conControl = MockControl.createControl(Connection.class);
    Connection con = (Connection) conControl.getMock();

    MockControl mdControl = MockControl.createControl(DatabaseMetaData.class);
    DatabaseMetaData md = (DatabaseMetaData) mdControl.getMock();

    ds.getConnection();
    dsControl.setReturnValue(con);

    con.getTransactionIsolation();
    conControl.setReturnValue(Connection.TRANSACTION_READ_COMMITTED);
    con.getAutoCommit();
    conControl.setReturnValue(false);

    con.getMetaData();
    conControl.setReturnValue(md);

    md.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
    mdControl.setReturnValue(true);

    md.supportsBatchUpdates();
    mdControl.setReturnValue(true);

    con.close();
    conControl.setVoidCallable(1);

    conControl.replay();
    mdControl.replay();
  }

  /**
   * This method may be updated when upgrading ORBroker to a newer version.
   * ORBroker does not use interface, and its main classes are final with a package scope visibility!!!
   * I found noway to mock ORBroker classes!!! jmock / cglib does not support final classes
   *
   * @param conControl Connection mock control
   * @param con    Connection mock
   * @throws SQLException
   */
  protected void prepareObtainExecutableInternals(MockControl conControl, Connection con) throws SQLException {
    con.getAutoCommit();
    conControl.setReturnValue(false);

    con.getTransactionIsolation();
    conControl.setReturnValue(Connection.TRANSACTION_READ_COMMITTED);
  }

}
TOP

Related Classes of org.springmodules.orm.orbroker.BrokerFactoryBeanTests

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.