我正试图对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();
}