Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Junit,Mockito,如何测试回调_Java_Junit_Mockito_Easymock - Fatal编程技术网

Java Junit,Mockito,如何测试回调

Java Junit,Mockito,如何测试回调,java,junit,mockito,easymock,Java,Junit,Mockito,Easymock,可能重复: 我有一个类可以从一种格式映射到另一种格式。由于这是遗留代码,我不敢重写它,它基本上是一组插件,所以如果我更改其中一个,我可能不得不更改所有其他插件。它的开发并没有考虑到测试。 这就是我的问题 interface Mapper { void handle(ClassA classA); void handle(ClassB classB); } public interface Publisher { public void publish(MappedCl

可能重复:

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

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

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

要想实现这一点,您必须通过
Publisher-Publisher=Mockito.mock(Publisher.class)

然后将其交给
MyMapper

如果需要断言
MappedClass
的状态,请使用
ArgumentCaptor
。有关示例,请参见

还有许多其他示例。

使用

@测试
公开无效测试(){
Publisher-Publisher=Mockito.mock(Publisher.class);
myMapper.setPublisher(publisher);
ArgumentCaptor captor=ArgumentCaptor.forClass(MappedClass.class);
....
myMapper.handle(…);
...
验证(publisher.publish)(captor.capture());
MappedClass passedValue=captor.getValue();
//在这里断言东西
}

问题在于,我想去掉wasCalled,但仍然能够验证MappedClass中的字段是否正确,如果我模拟Publisher.class,则无法验证MappedClass中的字段。我甚至不知道我的问题是否有解决方案,只是想问一个问题,看看有没有经验的Mockito或EasyMock的人以前见过这个问题。正确填写字段是否重要?你不能检查一下行为是否符合你的期望吗?我已经修改了答案,让你从
MappedClass
上的断言开始。是的,因为MyWrapper中有逻辑决定字段应该得到哪个值,这取决于“发布”的是ClassA还是ClassB。我不知道还有什么地方可以测试这个。非常感谢你的帮助。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
}