我正在对一门课程进行单元测试,我需要一定的时间才能检查结果。具体来说,我需要通过 x 分钟才能判断测试是否有效。我已经读过,在单元测试中我们应该测试接口而不是实现,所以我们不应该访问私有变量,但是除了在我的单元测试中休眠之外,我不知道如何在不修改私有变量的情况下进行测试。
我的测试是这样设置的:
@Test
public void testClearSession() {
final int timeout = 1;
final String sessionId = "test";
sessionMgr.setTimeout(timeout);
try {
sessionMgr.createSession(sessionId);
} catch (Exception e) {
e.printStackTrace();
}
DBSession session = sessionMgr.getSession(sessionId);
sessionMgr.clearSessions();
assertNotNull(sessionMgr.getSession(sessionId));
Calendar accessTime = Calendar.getInstance();
accessTime.add(Calendar.MINUTE, - timeout - 1);
session.setAccessTime(accessTime.getTime()); // MODIFY PRIVATE VARIABLE VIA PROTECTED SETTER
sessionMgr.clearSessions();
assertNull(sessionMgr.getSession(sessionId));
}
除了修改 accessTime 私有变量(通过创建 setAccessTime 设置器或反射)或在单元测试中插入睡眠之外,是否可以对此进行测试?
编辑 2012 年 4 月 11 日
我特别想测试我的 SessionManager 对象是否在特定时间段过去后清除会话。我正在连接的数据库将在一段固定时间后断开连接。当我接近该超时时,SessionManager 对象将通过调用数据库上的“最终会话”过程来清除会话,并从其内部列表中删除会话。
SessionManager 对象被设计为在单独的线程中运行。我正在测试的代码如下所示:
public synchronized void clearSessions() {
log.debug("clearSessions()");
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MINUTE, - timeout);
Iterator<Entry<String, DBSession>> entries = sessionList.entrySet().iterator();
while (entries.hasNext()) {
Entry<String, DBSession> entry = entries.next();
DBSession session = entry.getValue();
if (session.getAccessTime().before(cal.getTime())) {
// close connection
try {
connMgr.closeconn(session.getConnection(), entry.getKey());
} catch (Exception e) {
e.printStackTrace();
}
entries.remove();
}
}
}
对 connMgr(ConnectionManager 对象)的调用有点令人费解,但我正在重构遗留代码,目前就是这样。Session 对象存储与数据库的连接以及一些相关数据。