使用EasyMock测试Observer的更新方法

时间:2014-06-24 14:46:20

标签: java unit-testing observer-pattern easymock

我正在尝试测试是否调用了实现Observer接口的类中的update方法。我正在使用EasyMock来模拟ConcreteObserver,以便我可以验证他的更新函数是否真正执行。

这是我的主题,Observable类:

public class Subject extends java.util.Observable {

   public funcA() {
      ...
      notifyObservers(this,aVariable);
      ...
   }
}

我有以下类,即观察者:

public class ConcreteObserver implements java.util.Observer {

   public ConcreteObserver(Subject subject) {
      subject.observer(this);
   }

   @Override
   public void update(Observable o, Object arg) {
   // TODO
   }
}

这是我的单元测试:

@Test
public void testUpdateFunction() {
   Subject subj = new Subject();
   ConcreteObserver mockedObserver = EasyMock.
                                     createMockBuilder(ConcreteObserver.class).
                                     withConstructor(subj).
                                     addMockedMethod("update").
                                     createMock();

   mockedObserver.update((Observable) EasyMock.anyObject(),EasyMock.anyObject());
   EasyMock.replay(mockedObserver);

   subj.funcA();

   EasyMock.verify(mockedObserver);
}

不幸的是我收到以下错误:

  

验证时出现预期失败:ConcreteObserver.update(,):expected:1,actual:0

有关如何解决此问题的任何想法?

1 个答案:

答案 0 :(得分:1)

如果您要对ConcreteObserver进行单独测试Subject测试;如果您想测试Subject,请执行此操作(假定import staticEasyMock):

@Test
public void testUpdateFunction() 
{
  Subject subject = new Subject();

  Observer observer = createMock(Observer.class);
  observer.update(eq(subject), anyObject());
  replay(observer);   

  subject.observer(observer);
  subject.funcA();

  verify(observer);
}