Android上的单元测试事件序列



我正试图对Android应用程序的一部分进行单元测试,其中一个类预计会调用特定的回调序列。在Android附带的JUnit版本中是否有一个很好的机制来处理这个问题?

到目前为止,我想到的是:

testObj.call(new Listener() {
  boolean a = false, b = false, c = false;
  @Override
  public doA() {
    assertFalse(a);
    a = true;
  }
  @Override
  public doB() {
    assertTrue(a);
    assertFalse(b);
    b = true;
  }
  @Override
  public doC() {
    assertTrue(b);
    assertFalse(c);
    c = true;
  });
assertTrue(c); // I know this won't work, but something like this

我想要的是……

final PhaseTester phazer = new PhaseTester();
testObj.call(new Listener() {
  @Override
  public doA() {
    phazer.doPhase(1);
  }
  @Override
  public doA() {
    phazer.doPhase(2);
  }
  @Override
  public doA() {
    phazer.doPhase(3);
  }
});
assertTrue(phazer.maxPhase(), 3);

在标准JVM中,mock框架(如Mockito)将为您提供这种类型的测试。我从来没有做过任何android开发,并且意识到传统的mock框架不能与Dalvik JVM一起工作。然而,我发现了这篇关于Roboelectric的文章,它将允许你在Android模拟器之外对你的代码进行单元测试。

你可以这样写…

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
@Test
public void testSomething() {
    // create a mock object
    PhaseTester phaser = mock(PhaseTester.class);
    // perform test
    TestObj testObj = new TestObj();
    testObj.call(phaser);
    // verfiy the mock object was called
    verify(phaser).doA();
    verify(phaser).doB();
    verify(phaser).doC();
}

最新更新