小编All*_*an5的帖子

如何在不访问私有变量的情况下测试jUnit测试中的时间传递?

我正在测试一个我需要一定时间才能通过的课程才能检查结果.具体来说,我需要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));
}
Run Code Online (Sandbox Code Playgroud)

除了修改accessTime私有变量(通过创建setAccessTime setter或反射)或在单元测试中插入sleep之外,是否可以测试这个?

编辑2012年4月11日

我特意试图测试我的SessionManager对象在经过一段特定时间后清除会话.我连接的数据库将在一段固定的时间后丢弃连接.当我接近该超时时,SessionManager对象将通过调用数据库上的"finalize session"过程来清除会话,并从其内部列表中删除会话.

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()) …
Run Code Online (Sandbox Code Playgroud)

java tdd junit unit-testing

5
推荐指数
1
解决办法
2853
查看次数

单元测试Amazon SWF子工作流程

我有一个父工作流(ParentWorkflow)调用子工作流(ChildWorkflow),我正在尝试测试该调用.

父代码看起来像这样:

public class ParentWorkflow {
    private final ChildWorkflowClientFactory childWorkflowClientFactory =
            new ChildWorkflowClientFactoryImpl();

    public void runWorkflow() {
        new TryCatch() {
            @Override
            protected void doTry() throws Throwable {
                Promise<Void> workflowFinished = childWorkflowClient.childWorkflow(x);
                ...
            }
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我想模拟 childWorkflowClient.childWorkflow(x) 调用,但是当我连接单元测试时,我似乎没有注入客户端工厂的选项,单元测试代码如下所示:

@Rule
public WorkflowTest workflowTest = new WorkflowTest();
@Mock
private Activities mockActivities;

private ParentWorkflowClientFactory workflowFactory
        = new ParentWorkflowClientFactoryImpl();

@Before
public void setUp() throws Exception {
    // set up mocks
    initMocks(this);

    workflowTest.addActivitiesImplementation(mockActivities);
    workflowTest.addWorkflowImplementationType(ParentWorkflowImpl.class);
    workflowTest.addWorkflowImplementationType(ChildWorkflowImpl.class);
Run Code Online (Sandbox Code Playgroud)

我似乎无法将任何内容传递到工作流实现类中,还有另一种方法可以模拟子工作流吗?

java unit-testing amazon-swf

2
推荐指数
1
解决办法
1470
查看次数

标签 统计

java ×2

unit-testing ×2

amazon-swf ×1

junit ×1

tdd ×1