hades 发表于 2006-3-6 13:44:40

转载(Junit单元测试。。。。)--Junit实例

public class DefaultConnectionProxy extends ConnectionProxy {

private static final String name = "Default Connection Proxy";
private static final String description = "这个类简单的包装了oracle对数据连接缓冲池的实现。";
private static final String author = "Ion-Global.com";
private static final int major_version = 0;
private static final int minor_version = 9;
private static final boolean pooled = true;
private ConnectionBroker connectionBroker = null;
private Properties props;
private Properties propDescriptions;

private Object initLock = new Object();

// Test Code Begin...
/* 为了能够了解对象的状态变化,因此需要把表征对象内部状态变化的部分私有变量提供公共的访问接口
(或者提供让同一个类包的访问接口),以便使测试单元可以有效地判断对象的状态转变,
   在本示例中对包装的OracleConnectionCacheImpl对象提供访问接口。
*/
OracleConnectionCacheImpl getConnectionCache() {
if (connectionBroker == null) {
throw new IllegalStateException("You need start the server first.");
}

return connectionBroker.getConnectionCache();
}
OracleConnectionCachelmpl getConnectionCache(){
if(connectionBroken == null){
throw new IllegalStateException("You need start the server first.");
}


// Test Code End...

在公开内部状态数据後,我们就可以编写我们的测试单元了,单元测试的选择方法和选择尺度已经在本文前面章节进行了说明,
但是仍然需要注意的是,由于assert方法会抛出一个error,你应该在测试方法的最后集中用assert相关方法进行判断,
这样可以确保资源得到释放。

对数据库连接池的例子,我们可以建立测试类DefaultConnectionProxyTest,同时建立数个test case,如下

示例二
/**
* 这个类对示例一中的类进行简单的测试。
*
*/
public class DefaultConnectionProxyTest extends TestCase {
private DefaultConnectionProxy conProxy = null;
private OracleConnectionCacheImpl cacheImpl = null;
private Connection con = null;

/** 设置测试的fixture,建立必要的测试起始环境。
*/
protected void setUp() {
conProxy = new DefaultConnectionProxy();
conProxy.start();
cacheImpl = conProxy.getConnectionCache();
}

/** 对示例一中的对象进行服务启动后的状态测试,检查是否在服务启动后,
连接池的参数设置是否正确。
*/
public void testConnectionProxyStart() {
int minConnections = 0;
int maxConnections = 0;

assertNotNull(cacheImpl);

try{
minConnections = Integer.parseInt(PropertyManager.getProperty
("DefaultConnectionProxy.minConnections"));
maxConnections = Integer.parseInt(PropertyManager.getProperty
("DefaultConnectionProxy.maxConnections"));
} catch (Exception e) {
// ignore the exception
}

assertEquals(cacheImpl.getMinLimit(), minConnections);
assertEquals(cacheImpl.getMaxLimit(), maxConnections);
assertEquals(cacheImpl.getCacheSize(), minConnections);
}


/** 对示例一中的对象进行获取数据库连接的测试,看看是否可以获取有效的数据库连接,
并且看看获取连接后,连接池的状态是否按照既定的策略进行变化。由于assert方法抛出的是
error对象,因此尽可能把assert方法放置到方法的最后集体进行测试,这样在方法内打开的
资源,才能有效的被正确关闭。
*/
public void testGetConnection() {
int cacheSize = cacheImpl.getCacheSize();
int activeSize = cacheImpl.getActiveSize();
int cacheSizeAfter = 0;
int activeSizeAfter = 0;

con = conProxy.getConnection();

if (con != null) {
activeSizeAfter = cacheImpl.getActiveSize();
cacheSizeAfter = cacheImpl.getCacheSize();

try{
con.close();
} catch (SQLException e) {
}
} else {
assertNotNull(con);
}

/*如果连接池中的实际使用连接数小于缓存连接数,检查获取的新的数据连接是否
从缓存中获取,反之连接池是否建立新的连接
*/
if (cacheSize > activeSize){
assertEquals(activeSize + 1, activeSizeAfter);
assertEquals(cacheSize, cacheSizeAfter);
} else {
assertEquals(activeSize + 1, cacheSizeAfter);
}
}

/** 对示例一中的对象进行数据库连接释放的测试,看看连接释放后,连接池的
状态是否按照既定的策略进行变化。由于assert方法抛出的是error对象,因此尽可
能把assert方法放置到方法的最后集体进行测试,这样在方法内打开的
资源,才能有效的被正确关闭。
*/
public void testConnectionClose() {
int minConnections = cacheImpl.getMinLimit();
int cacheSize = 0;
int activeSize = 0;
int cacheSizeAfter = 0;
int activeSizeAfter = 0;

con = conProxy.getConnection();

if (con != null) {
cacheSize = cacheImpl.getCacheSize();
activeSize = cacheImpl.getActiveSize();

try{
con.close();
} catch (SQLException e) {
}

activeSizeAfter = cacheImpl.getActiveSize();
cacheSizeAfter = cacheImpl.getCacheSize();
} else {
assertNotNull(con);
}

assertEquals(activeSize, activeSizeAfter + 1);

/*如果连接池中的缓存连接数大于最少缓存连接数,检查释放数据连接后是否
缓存连接数比之前减少了一个,反之缓存连接数是否保持为最少缓存连接数
*/
if (cacheSize > minConnections){
assertEquals(cacheSize, cacheSizeAfter + 1);
} else {
assertEquals(cacheSize, minConnections);
}
}

/** 释放建立测试起始环境时的资源。
*/
protected void tearDown() {
cacheImpl = null;
conProxy.destroy();
}

public DefaultConnectionProxyTest(String name) {
super(name);
}

/** 你可以简单的运行这个类从而对类中所包含的测试单元进行测试。
*/
public static void main(String args[]) {
junit.textui.TestRunner.run(DefaultConnectionProxyTest.class);
}
}


2.很多时候,我们要写一些单元测试来测试我们程序是否能正确触发异常。
  比如下面的例子中,我们就写了一个test case来测试一个Email验证类EmailAddrValidator,
这个类有一个doValidate(email)方法可以验证email是否合法,如果不合法则会抛出ValidationException异常。
因此我们写了两个方法来进行单元测试,前一个方法testDoValidate用来测试正常值,
后一个方法testDoValidateException用来测试对错误的email格式是否能正确触发异常。
这个例子的关键是方法testDoValidateException(String email) 。

import junit.framework.TestCase;

public class TestEmailAddrValidator extends TestCase {
    EmailAddrValidator validator = new EmailAddrValidator();

    public void testDoValidate() throws ValidationException {
      validator.doValidate("glchengang@163.com", null);
      validator.doValidate("glchen.gang@163.com", null);
      validator.doValidate("glchen_gang@163.com", null);
      validator.doValidate("glchen.gang@163_tom.com", null);
    }

    public void testDoValidateException() {
      testDoValidateException("@b.c");
      testDoValidateException("a@.c");
      testDoValidateException("a@b.");
      testDoValidateException("@.c");
      testDoValidateException("@...");
      testDoValidateException(" ");
      testDoValidateException(null);
    }

    private void testDoValidateException(String email) {
      try {
            validator.doValidate(email, null);
            fail("末抛出异常");
      } catch (ValidationException e) {
            assertTrue(true);
      }
    }
}


-----------------------------------------
注:在这里Locale 参数并没有用到。
import java.util.Locale;

import com.hygensoft.common.configure.ConfigureObject;

public class EmailAddrValidator{

    protected static final String ERROR_CODE_INVALID_EMAIL_ADDR = "INVALID_EMAIL_ADDR";
    protected static final String ERROR_CODE_INVALID_INPUT = "INVALID_INPUT_OBJECT";

    public Object doValidate(Object input, Locale locale) throws ValidationException {
      if (!(input instanceof String)) {
            throw new ValidationException(ERROR_CODE_INVALID_INPUT, input);
      }
      String inputStr = (String) input;
      int idx = inputStr.indexOf('@');
      if (idx == -1 || idx == 0) {
            throw new ValidationException(ERROR_CODE_INVALID_INPUT, input);
      }
      int idx2 = inputStr.indexOf('.', idx);
      if (idx2 == -1 || idx2 == idx + 1) {
            throw new ValidationException(ERROR_CODE_INVALID_INPUT, input);
      }
      if (inputStr.endsWith(".")) {
            throw new ValidationException(ERROR_CODE_INVALID_INPUT, input);
      }
      return input;
    }

    /* (non-Javadoc)
   * @see com.hygensoft.common.configure.Configurable#initialize(com.hygensoft.common.configure.ConfigureObject)
   */
    public void initialize(ConfigureObject conf) {}

}

hades 发表于 2006-3-6 13:45:33

hades

供 大家分享。。。。。。。

anyfrecom 发表于 2011-5-6 16:07:10

很好、谢谢、、、、、、、、、

lengyao 发表于 2011-9-2 17:52:41

好东西 也要顶一下!

田行kg柳 发表于 2012-3-19 15:18:34

http://www.pgpop.com/image/face1.gif顶起来,支持楼主 顶~~~~~~~~~~~~~~~





















http://qb.lqualyn.com/images/sigline.gif
颈椎病怎么治

Alawn 发表于 2017-12-27 21:41:15

:victory:
页: [1]
查看完整版本: 转载(Junit单元测试。。。。)--Junit实例