在我的应用程序中,我使用观察者模式进行某些操作,我想在单元测试中测试它们。问题是我不知道如何使用junit / mockito /其他东西测试观察者。有什么帮助吗?
例如,这是我的单元测试:
@Before
public void setUp() throws IOException, Exception {
observer = new GameInstanceObserver(); // observable (GameInstance) will call update() method after every change
GameInstance.getInstance().addObserver(observer); // this is observable which is updated by serverService
}
@Test(expected = UserDataDoesntExistException.class)
public void getRoomUserData_usingNullKey_shouldThrowUserDataDoesntExist() throws InterruptedException, UserDataDoesntExistException {
serverService.createRoom("exampleRoom"); // this operation is asynchronous and updates GameInstance data (as I wrote before GameInstance is Observable)
Thread.sleep(400); // how to do it in better way?
GameInstance gi = (GameInstance) observer.getObservable();
assertTrue(gi.getRoom("exampleRoom").getRoomId().equals("exampleRoom"));
}
我不想使用Thread.sleep()
并以这种方式使用它(或类似的):
@Test(expected = UserDataDoesntExistException.class)
public void getRoomUserData_usingNullKey_shouldThrowUserDataDoesntExist() throws InterruptedException, UserDataDoesntExistException {
serverService.createRoom("exampleRoom"); // this operation is asynchronous and updates GameInstance data (as I wrote before GameInstance is Observable)
waitUntilDataChange(GameInstance.getInstance()); // wait until observable will be changed so I know that it notified all observer and I can validate data
GameInstance gi = (GameInstance) observer.getObservable();
assertTrue(gi.getRoom("exampleRoom").getRoomId().equals("exampleRoom"));
}
答案 0 :(得分:9)
如果我理解正确,问题不是测试观察者,而是测试异步方法调用的结果。为此,创建一个阻塞的观察者,直到调用update()方法。如下所示:
public class BlockingGameObserver extends GameInstanceObserver {
private CountDownLatch latch = new CountDownLatch(1);
@Override
public void update() {
latch.countDown();
}
public void waitUntilUpdateIsCalled() throws InterruptedException {
latch.await();
}
}
在你的测试中:
private BlockingGameObserver observer;
@Before
public void setUp() throws IOException, Exception {
observer = new BlockingGameObserver();
GameInstance.getInstance().addObserver(observer);
}
@Test
public void getRoomUserData_usingNullKey_shouldThrowUserDataDoesntExist() throws InterruptedException, UserDataDoesntExistException {
serverService.createRoom("exampleRoom");
observer.waitUntilUpdateIsCalled();
assertEquals("exampleRoom",
GameInstance.getInstance().getRoom("exampleRoom").getRoomId());
}