Junit,Mockito,如何测试回调



可能重复:
使用Mockito 在方法调用时拦截对象

我有一个类可以从一种格式映射到另一种格式。由于这是遗留代码,我不敢重写,它基本上是一组插件,所以如果我更改其中一个,我可能不得不更改所有其他插件。它的开发并没有考虑到测试。所以这就是我的问题。

interface Mapper {
    void handle(ClassA classA);
    void handle(ClassB classB);
}
public interface Publisher {
    public void publish(MappedClass mappedClass);
}
class MyMapper implements Mapper {
    private Publisher publisher;
    public void setPublisher(final Publisher publisher) {
        this.publisher = publisher;
    }
    public handle(ClassA classA) {
        final MappedClass mappedClass = // Map from ClassA to MappedClass
        publisher.publish(mappedClass);
    }
    public handle(ClassB classB) {
        final MappedClass mappedClass = // Map from ClassB to MappedClass
        publisher.publish(mappedClass);
    }
}

好的。因此,根据"处理"的类,MappedClass将使用不同的值发布,这是我想要验证(测试)的值。问题是,我将得到一个测试,首先我必须编写代码来测试publish方法的调用

private boolean wasCalled;
@Test
public void testClassAMapped() {
    wasCalled = false;
    final MyMapper myMapper = new MyMapper();
    myMapper.setPublisher(new Publisher() {
        public void publish(final MappedClass mappedClass) {
            wasCalled = true;
           // Code for verifying the fields in mappedClass
        });
    }
    final ClassA classA = // Create classA
    myMapper.handle(classA);
    assertTrue(wasCalled);
}

因此,首先我们创建了我们的模拟Publisher,它将首先将wasCalled的状态设置为true,这样我们就知道这个方法曾经被调用过(这个例子被简化了,所以代码中实际上有一个调度器……遗留代码,所以我不想更改它),其次我想验证MappedClass是否具有正确的字段值。我想知道的是,是否有人知道更好的测试方法?wasCalledwasCalled检查或多或少成为我的许多测试的样板代码,但由于我不想添加太多混乱(自己的黑客、测试基类等),我想知道是否有办法在Mockito或EasyMock中做到这一点?

使用Mockito ArgumentCaptor

@Test
public void test(){
  Publisher publisher = Mockito.mock(Publisher.class);
  myMapper.setPublisher(publisher);
  ArgumentCaptor<MappedClass> captor = ArgumentCaptor.forClass(MappedClass.class);
  ....
  myMapper.handle(...);
  ...
  verify(publisher).publish(captor.capture());
  MappedClass passedValue = captor.getValue();
  // assert stuff here
}

我不确定我是否完全理解这个问题,但看起来你正在寻找Mockito.verify(publisher).publish(Matchers.isA(MappedClass.class));

要做到这一点,您必须通过
模拟PublisherPublisher publisher = Mockito.mock(Publisher.class)
然后将其交给CCD_ 12。

如果需要断言MappedClass的状态,请使用ArgumentCaptor。请参阅此答案以获取示例。

Mockito-API-doc还有许多其他的例子。

相关内容

  • 没有找到相关文章

最新更新