在河里抓鱼的熊

抓鱼杂谈

Archive for the ‘java’ tag

解决一个jUnit运行时错误

without comments

情况概述:

已经经过测试、运行过多遍的一个jUnit测试用例突然不能用了,运行时提示:

java.lang.Exception: Method setupOnce() should be static
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)

代码如下:

@RunWith(Parameterized.class)
public class SqlIndexLogicTest {

	Object[] paramNow;

	private String expected;
	private JSONArray target;

	@Parameters
	public static Collection<object []> params() throws JSONException{
		return Arrays.asList(new Object[][]{
				{"SELECT * FROM (SELECT REQUEST_TIME,RESULT_ID,KEY_CODE,REGION_CODE FROM SD_UKMS_LOG GROUP BY REQUEST_TIME,REGION_CODE,KEY_CODE,RESULT_ID ORDER BY REGION_CODE) WHERE 1=1 and request_time>to_date('2011-09-21', 'yyyy-mm-dd')",
					new JSONArray("[1506, 0, 5, {'request_time':['2011-09-21']}]")},
				{"SELECT * FROM (SELECT REGION_CODE,CAS_ID,REQUEST_TIME,UKMS_ID FROM SD_UKMS_LOG) WHERE 1=1 and region_code=931",
					new JSONArray("[1510, 0, 5, {'region_code':['931']}]")},
				{"SELECT * FROM (SELECT REGION_CODE,CAS_ID,REQUEST_TIME,UKMS_ID FROM SD_UKMS_LOG) WHERE 1=1 and region_code in ('931','000')",
					new JSONArray("[1510, 0, 5, {'region_code':['931','0000']}]")},
				{"SELECT * FROM (SELECT REGION_CODE,CAS_ID,REQUEST_TIME,UKMS_ID FROM SD_UKMS_LOG) WHERE 1=1 and region_code in ('931','0000') and request_time< =to_date('2012-01-01', 'yyyy-mm-dd')",
					new JSONArray("[1510, 0, 5, {'region_code':['931','0000'], 'request_time':['2012-01-01']}]")},
				{"SELECT * FROM (SELECT REGION_CODE,CAS_ID,REQUEST_TIME,UKMS_ID FROM SD_UKMS_LOG)",
					new JSONArray("[1509, 0, 5]")},
				{"SELECT * FROM (SELECT REGION_CODE,CAS_ID,REQUEST_TIME,UKMS_ID FROM SD_UKMS_LOG) WHERE 1=1",
					new JSONArray("[1509, 0, 5, {'region_code':[], 'cas_id':[], 'request_time':[]}]")},
				{"SELECT * FROM (SELECT REGION_CODE,CAS_ID,REQUEST_TIME,UKMS_ID FROM SD_UKMS_LOG) WHERE 1=1",
					new JSONArray("[1509, 0, 5, {'region_code':[''], 'cas_id':[''], 'request_time':['']}]")},
				{"SELECT * FROM (SELECT REGION_CODE,CAS_ID,REQUEST_TIME,UKMS_ID FROM SD_UKMS_LOG) WHERE 1=1 and region_code=931",
					new JSONArray("[1509, 0, 5, {'region_code':['931'], 'cas_id':[''], 'request_time':['']}]")},
				{"SELECT * FROM (SELECT REGION_CODE,CAS_ID,REQUEST_TIME,UKMS_ID FROM SD_UKMS_LOG) WHERE 1=1 and region_code=931 and cas_id=13519000753",
					new JSONArray("[1509, 0, 5, {'region_code':['931'], 'cas_id':['13519000753'], 'request_time':['']}]")},
				{"SELECT * FROM (SELECT REGION_CODE,CAS_ID,REQUEST_TIME,UKMS_ID FROM SD_UKMS_LOG) WHERE 1=1 and region_code=931 and cas_id=13519000753 and request_time<=to_date('2011-09-21', 'yyyy-mm-dd')",
					new JSONArray("[1509, 0, 5, {'region_code':['931'], 'cas_id':['13519000753'], 'request_time':['2011-09-21']}]")},
		});
	}

	public SqlIndexLogicTest(String expected, JSONArray target){
		this.target = target;
		this.expected = expected;
	}

	@BeforeClass
	public void setUpOnce() throws JSONException{
	}

	@AfterClass
	public static void tearDownOnce(){

	}

	@Before
	public void init() throws JSONException{
		JSONObject conditionObj = target.optJSONObject(3);
		Map<String, String[]> whereParams = new TreeMap<string , String[]>();
		if(conditionObj != null){
			@SuppressWarnings("unchecked")
			Iterator</string><string> it = conditionObj.keys();
			while(it.hasNext()){
				String key = it.next();
				System.out.println("key:"+key);
				JSONArray subCondArr = conditionObj.getJSONArray(key);
				String[] subCondArrStr = new String[subCondArr.length()];
				for(int j=0; j<subcondarr .length(); j++){
					subCondArrStr[j] = subCondArr.getString(j);
				}
				whereParams.put(key, subCondArrStr);
			}
		}
		paramNow = new Object[]{target.get(0), target.get(1), target.get(2), whereParams, target.optJSONArray(4)};
	}

	@After
	public void destroy(){
	}

	@Ignore("pause this method test")
	@Test
	public void queryNormal() throws DAOException, JSONException{
		org.json.JSONObject jo = SqlIndexLogic.getInstance()
				.query((Integer) paramNow[0], (Integer) paramNow[1], (Integer) paramNow[2], (Map<String, String[]>) paramNow[3], (JSONArray) paramNow[4]);
		System.out.println(jo);
	}

	@Test
	public void buildWrapedSQL() throws DAOException, JSONException{
		String baseSQL = SqlIndexLogic.getInstance().getBaseSQL((Integer) paramNow[0]);
		StringBuilder sql = SqlIndexLogic.getInstance()
				.buildWrapedSQL(baseSQL, (Integer) paramNow[0], (Integer) paramNow[1], (Integer) paramNow[2], (Map<string , String[]>) paramNow[3], (JSONArray) paramNow[4]);
		System.out.println(sql);
		assertEquals(expected, sql.toString());
	}

}

解决方法:

将setupOnce()方法改成static修饰即可。

原因:

@BeforeClass和@AfterClass注解的两个方法需要静态化,以符合jUnit调用机制。而那个@BeforeClass注解的setupOnece()方法的static修饰符不知道什么时候不小心删掉了。

Written by qianxiong

January 18th, 2012 at 4:44 pm

Posted in 技术,笔记,经验之谈

Tagged with ,

使用jboss的minimal配置,加快服务器启动

without comments

jboss如果使用default配置,仅部署了一个只有index.jsp的war项目启动都要耗费17s,等待过程还是比较漫长的,加快服务器启动的方法就是采用minimal配置。

不过默认的minimal配置总是无法启动,这里摘抄一位外国友人的方法(原文)并翻译如下:

Step 1: Copy “Tomcat” Service to the Custom Configuration

cp -R server/default/deploy/jbossweb-tomcat50.sar server/custom/deploy/

Step 2: Modify Tomcat’s Configuration

找到jbossweb-tomcat50.sar/META-INF下的jboss-service.xml文件,将下面两行注释掉:
<depends optional-attribute-name="SecurityManagerService"
proxy-type="attribute">jboss.security:service=JaasSecurityManager
</depends>
<depends>jboss:service=TransactionManager</depends>

Step 3: Copy over some needed libraries

server/default/lib copy下列jar包到 server/custom/lib里:

javax.servlet.jar javax.servlet.jsp.jar jbosssx.jar jboss-j2ee.jar jboss.jar commons-logging.jar

Step 4: Try it out!

以上是以custom配置为例,其实对于minimal配置而言更广泛,同样实用。采用以上配置后,启动时间仅需3s!

Written by qianxiong

May 6th, 2011 at 1:08 am

Posted in 技术,笔记

Tagged with , ,