Archive for the ‘java’ tag
解决一个jUnit运行时错误
情况概述:
已经经过测试、运行过多遍的一个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修饰符不知道什么时候不小心删掉了。
使用jboss的minimal配置,加快服务器启动
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!