-1

我以为我已经采取了必要的措施来防止数据竞争,但它似乎没有奏效......

我编写了一个分层状态机来实现硬币问答游戏。鉴于刚刚处理了信用事件,我的一个 JUnit 测试检查是否需要打印到屏幕的最后一行。我发现该行确实按预期打印在屏幕上,但是用于存储最后一个打印值的字符串在测试时为空。

我已经确定 String 引用是volatile,所以我希望来自事件处理线程的写入对 JUnit 线程上的读取是可见的。

机器类包含事件处理循环和以下用于读取和写入字符串引用的代码:

private volatile String lastPrintln;

public String lastPrintln(){
    return lastPrintln;
}

void println(String s){
   System.out.println(s);
   lastPrintln = s;
} 

测试代码如下...

@Before
public void setUp() throws Exception {
    machine = Objects.create(CoinQuizMachine.class);
    machine.start(); // starts event loop thread
}

private void waitForEventQueueToEmpty(){
    while(!machine.eventQueueIsEmpty()){

    }
}

private void processTestEvent(Event e){
    machine.add(e);
    waitForEventQueueToEmpty();
}

@Test
public void test2() {   
    assertEquals(Demo.class,machine.activeState().getClass());
    processTestEvent(new CreditEvent(1));
    assertEquals("Topic Choices: \nMaths\nScience",machine.lastPrintln());
}
4

1 回答 1

0

是的,我的错,我发现了这个错误,我在未处理事件实际被处理之前减少了它们的值,这意味着测试触发到早期,并且有时 lastPrintln 没有更新。谢谢你们的帮助。

于 2013-05-25T14:59:29.130 回答