我有一个可以从一种格式到另一种格式的类。由于这是遗留代码,我不敢重写它,它基本上是一组插件,所以如果我改变一个,我可能要改变所有其他。它不是在考虑测试的情况下开发的。 所以这是我的问题。
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
是否具有正确的字段值。
我想知道的是,如果有人知道更好的测试方法吗?对于我的许多测试,wasCalled
和wasCalled
检查会或多或少地成为样板代码,但由于我不想添加那么多混乱(自己的黑客,测试基类等),我会想知道在Mockito或EasyMock中是否有办法做到这一点?
答案 0 :(得分:6)
@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
}
答案 1 :(得分:5)
我不确定我是否完全理解这个问题,但看起来你正在寻找Mockito.verify(publisher).publish(Matchers.isA(MappedClass.class));
为了实现这一目标,你必须嘲笑Publisher
到
Publisher publisher = Mockito.mock(Publisher.class)
然后将其交给MyMapper
。
如果您需要声明MappedClass
的状态,请使用ArgumentCaptor
。有关示例,请参阅this answer。
Mockito-API-doc还有许多其他示例。