Junit,Mockito,如何测试回调

And*_*all 1 java junit easymock mockito

可能重复:
使用Mockito进行方法调用时的Intercept对象

我有一个可以从一种格式到另一种格式的类.由于这是遗留代码,我不敢重写它,它基本上是一组插件,所以如果我改变一个,我可能要改变所有其他.它不是在考虑测试的情况下开发的.所以这是我的问题.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

好的.因此,根据哪个类"处理" 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);
}
Run Code Online (Sandbox Code Playgroud)

所以首先我们创造我们的模拟Publisher,这将首先设置的状态wasCalledtrue,所以我们知道这个方法被称为过(这个例子被简化所以实际上是在代码调度员...遗留代码,所以我不想改变它),第二我想验证MappedClass具有正确的字段值.我想知道的是,如果有人知道更好的测试方法吗?的wasCalled,并wasCalled检查成为我的很多测试或多或少样板代码,但因为我不想增加那么多杂乱(自己的黑客,试验基地班等),我想知道是否有一种方法可以做到在Mockito,还是EasyMock?

Joh*_*n B 6

使用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
}
Run Code Online (Sandbox Code Playgroud)


Urs*_*pke 5

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

要做到这一点,你必须嘲笑Publisher通过
Publisher publisher = Mockito.mock(Publisher.class)
,然后把它交给MyMapper.

如果你需要声明状态MappedClass,请使用ArgumentCaptor.请参阅此答案以获取示例.

的Mockito-API的文档有许多额外的例子.