是否可以创建一个模拟对象,使用 EasyMock 实现多个接口?

是否可以创建一个模拟对象,使用 EasyMock 实现多个接口?

例如,接口和接口 ?FooCloseable

在 Rhino Mocks 中,您可以在创建模拟对象时提供多个接口,但 EasyMock 的方法只采用一种类型。createMock()

使用EasyMock实现这一点是否可能,而无需诉诸于创建一个扩展和的临时接口的后备方案,然后嘲笑它?FooCloseable


答案 1

虽然我基本上同意Nick Holt的答案,但我认为我应该指出,mockito允许通过以下电话做你要求的事情:

Foo mock = Mockito.mock(Foo.class, withSettings().extraInterfaces(Bar.class));

显然,你必须使用演员阵容:当你需要使用模拟作为一个,但该演员阵容不会抛出(Bar)mockBarClassCastException

这里有一个更完整的例子,尽管完全是荒谬的:

import static org.junit.Assert.fail;
import org.junit.Test;
import static org.mockito.Mockito.*;
import org.mockito.Mockito;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import org.hamcrest.Matchers;

import java.util.Iterator;


public class NonsensicalTest {


    @Test
    public void testRunnableIterator() {
        // This test passes.

        final Runnable runnable = 
                    mock(Runnable.class, withSettings().extraInterfaces(Iterator.class));
        final Iterator iterator = (Iterator) runnable;
        when(iterator.next()).thenReturn("a", 2);
        doThrow(new IllegalStateException()).when(runnable).run();

        assertThat(iterator.next(), is(Matchers.<Object>equalTo("a")));

        try {
            runnable.run();
            fail();
        }
        catch (IllegalStateException e) {
        }
    }

答案 2

你有没有考虑过这样的事情:

interface Bar extends Foo, Closeable {
}

然后模拟界面酒吧?


推荐