我在测试类中有一个存根测试,用于测试观察者接口。这是我的测试类,用于测试notifyObserver。知道如何正确模拟观察者吗?
//应该使用库为接口Observer正确创建模拟对象。
@ExtendWith(MockitoExtension.class)
class MockTest {
static class TestObserver implements Observer {
public Vector objv = new Vector();
int updateCount = 0;
@Override
public void update(Observable o, Object arg) {
++updateCount;
objv.add(arg);
}
public int updateCount() {
return updateCount;
}
}
static class TestObservable extends Observable {
public void doChange() {
setChanged();
System.out.println("Change status with setChanged :" + hasChanged());
notifyObservers();
}
public void clearChange() {
clearChanged();
}
}
@Test
public void testNotifyObservers() {
// Test for method void java.util.Observable.notifyObservers()
TestObservable observable;
observable = new TestObservable();
Observer observer = Mockito.mock(TestObserver.class);
observable.addObserver(observer = new TestObserver());
observable.notifyObservers();
assertEquals(0, ((TestObserver) observer).updateCount());
((TestObservable) observable).doChange();
observable.notifyObservers();
assertEquals(1, ((TestObserver) observer).updateCount());
//Mockito.verify(observer).;
}
如果我理解正确,则无需使用模仿对象来模仿对象。我稍微清理了一下您的测试方法:
@Test
public void testNotifyObservers() {
// Test for method void java.util.Observable.notifyObservers()
TestObservable observable = new TestObservable();
TestObserver observer = new TestObserver();
observable.addObserver(observer);
observable.notifyObservers();
assertEquals(0, observer.updateCount());
observable.doChange();
observable.notifyObservers();
assertEquals(1, observer.updateCount());
}
使用Mockito.spy():
@Test
public void testNotifyObservers() {
// Test for method void java.util.Observable.notifyObservers()
TestObservable observable = new TestObservable();
TestObserver observer = Mockito.spy(TestObserver.class);
observable.addObserver(observer);
observable.notifyObservers();
assertEquals(0, observer.updateCount());
observable.doChange();
observable.notifyObservers();
assertEquals(1, observer.updateCount());
Mockito.verify(observer, Mockito.times(2)).updateCount();
Mockito.verify((Observer) observer, Mockito.times(1)).update(any(), any());
Mockito.verifyNoMoreInteractions(observer);
}