package jef.database.routing; import java.sql.SQLException; import javax.naming.NamingException; import jef.database.DbClient; import jef.database.DbClientBuilder; import jef.database.ORMConfig; import jef.database.datasource.DbDataSourceLookup; import jef.database.datasource.JndiDatasourceLookup; import jef.database.datasource.MapDataSourceLookup; import jef.database.datasource.PropertiesDataSourceLookup; import jef.database.datasource.SimpleDataSource; import jef.database.datasource.SpringBeansDataSourceLookup; import jef.database.datasource.URLJsonDataSourceLookup; import jef.database.dialect.ColumnType; import jef.database.meta.TupleMetadata; import jef.http.HttpServerEmu; import jef.http.Response; import jef.tools.Assert; import jef.tools.IOUtils; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.mock.jndi.SimpleNamingContextBuilder; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.google.common.base.Function; /** * 单元测试,测试六种DataSourceLookup * @author jiyi * */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:spring/spring-dslookup-test.xml" }) public class DatasourceLookupTest extends org.junit.Assert implements ApplicationContextAware{ protected ApplicationContext applicationContext; @Test public void testProperties(){ PropertiesDataSourceLookup lookup=applicationContext.getBean(PropertiesDataSourceLookup.class); Assert.notNull(lookup); SimpleDataSource ds1=(SimpleDataSource)lookup.getDataSource("ds1"); assertNotNull(ds1); assertEquals("jdbc:mysql://localhost:3306/test", ds1.getUrl()); assertEquals("root", ds1.getUser()); assertEquals("root", ds1.getUsername()); assertEquals("org.gjt.mm.mysql.Driver", ds1.getDriverClass()); assertEquals(5, lookup.getAvailableKeys().size()); } @Test public void testJSON(){ URLJsonDataSourceLookup lookup=applicationContext.getBean(URLJsonDataSourceLookup.class); //为了测试,使用HTTP模拟器 HttpServerEmu server=new HttpServerEmu(9999); server.setHandler(new Function<Response, Void>() { public Void apply(Response arg0) { arg0.returnResource("plain/text;charset=UTF-8",getClass().getResourceAsStream("/spring/datasource_lookup.json")); return null; } }).start(); SimpleDataSource ds1=(SimpleDataSource)lookup.getDataSource("ds2"); assertNotNull(ds1); assertEquals("jdbc:mysql://localhost:3306/test", ds1.getUrl()); assertEquals("root", ds1.getUser()); assertEquals("root", ds1.getUsername()); assertEquals("org.gjt.mm.mysql.Driver", ds1.getDriverClass()); assertEquals(5, lookup.getAvailableKeys().size()); IOUtils.closeQuietly(server); } @Test public void testJndi() throws NamingException{ SimpleNamingContextBuilder jndiEnv = SimpleNamingContextBuilder.emptyActivatedContextBuilder(); SimpleDataSource ds=new SimpleDataSource("jdbc:mysql://localhost:3306/test","root","admin"); ds.setDriverClass("com.mysql.jdbc.Driver"); jndiEnv.bind("ds1", ds); jndiEnv.bind("ds2", ds); jndiEnv.bind("ds3", ds); JndiDatasourceLookup lookup=applicationContext.getBean(JndiDatasourceLookup.class); SimpleDataSource ds1=(SimpleDataSource)lookup.getDataSource("ds2"); assertNotNull(ds1); assertEquals("jdbc:mysql://localhost:3306/test", ds1.getUrl()); assertEquals("root", ds1.getUser()); assertEquals("root", ds1.getUsername()); assertEquals("com.mysql.jdbc.Driver", ds1.getDriverClass()); assertEquals(3, lookup.getAvailableKeys().size()); } @Test public void testDb() throws SQLException{ mockDatabase(); //开始测试 DbDataSourceLookup lookup=applicationContext.getBean(DbDataSourceLookup.class); SimpleDataSource ds1=(SimpleDataSource)lookup.getDataSource("ds2"); assertNotNull(ds1); assertEquals("jdbc:mysql://localhost:3306/test", ds1.getUrl()); assertEquals("root", ds1.getUser()); assertEquals("root", ds1.getUsername()); assertEquals(3, lookup.getAvailableKeys().size()); } @Test public void testMap(){ MapDataSourceLookup lookup=applicationContext.getBean(MapDataSourceLookup.class); SimpleDataSource ds1=(SimpleDataSource)lookup.getDataSource("ds2"); assertEquals("jdbc:derby:./db2;create=true", ds1.getUrl()); assertEquals(null, ds1.getUser()); assertEquals(3, lookup.getAvailableKeys().size()); } @Test public void testSpring(){ SpringBeansDataSourceLookup lookup=applicationContext.getBean(SpringBeansDataSourceLookup.class); SimpleDataSource ds1=(SimpleDataSource)lookup.getDataSource("datasource2"); assertEquals("jdbc:derby:./db2;create=true", ds1.getUrl()); assertEquals(null, ds1.getUser()); assertEquals(3, lookup.getAvailableKeys().size()); } private void mockDatabase() throws SQLException { DbClient db=new DbClientBuilder("jdbc:hsqldb:mem:db1","","").setMaxPoolSize(2).build(); ORMConfig.getInstance().setDebugMode(false); TupleMetadata t=new TupleMetadata("DATASOURCE_CONFIG"); t.addColumn("ENABLE", new ColumnType.Char(1)); t.addColumn("JDBC_URL", new ColumnType.Varchar(64)); t.addColumn("DB_USER", new ColumnType.Varchar(64)); t.addColumn("DB_PASSWORD", new ColumnType.Varchar(64)); t.addColumn("DATABASE_NAME", new ColumnType.Varchar(64)); db.createTable(t); db.insert( t.newInstance().set("ENABLE", "1") .set("DATABASE_NAME", "ds1") .set("JDBC_URL", "jdbc:mysql://localhost:3306/test") .set("DB_USER", "root") .set("DB_PASSWORD", "d3d43r43") ); db.insert( t.newInstance().set("ENABLE", "1") .set("DATABASE_NAME", "ds2") .set("JDBC_URL", "jdbc:mysql://localhost:3306/test") .set("DB_USER", "root") .set("DB_PASSWORD", "43gdsfsd3") ); db.insert( t.newInstance().set("ENABLE", "1") .set("DATABASE_NAME", "ds3") .set("JDBC_URL", "jdbc:mysql://localhost:3306/test") .set("DB_USER", "root") .set("DB_PASSWORD", "sdfs333csd") ); db.close(); } public void setApplicationContext(ApplicationContext arg0) throws BeansException { this.applicationContext=arg0; } }