java - Junit,Mockito,如何测试回调

标签 java junit mockito easymock

<分区>

Possible Duplicate:
Intercept object on method invocation with 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 检查或多或少成为我的许多测试的样板代码,但由于我不想添加那么多困惑(自己的 hacks,测试基础类等)我想知道在 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
}

关于java - Junit,Mockito,如何测试回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12352380/

相关文章:

Java二进制转换器

java - 如何让Mockito在调用另一个方法内的方法时执行Return?

java - JUnit + Powermock - new Date() - NullPointerException

java - PowerMockito.when 返回 null

java - 用于数据库实现的内存映射MappedByteBuffer或直接ByteBuffer?

java - 带有自定义 JUL 记录器的 Jetty

java - 如何在android中制作自定义Arrays.asList

spring - 如何在内存中进行单元测试 Spring-Jersey

android-studio - 在 Android Studio 2.3 中运行覆盖率测试

testing - TFS 测试结果详细报告与 SoapUI 项目结构不一致