Действительно ли возможно создать фиктивный объект, который реализует несколько интерфейсов с EasyMock?

Когда Вы идете для строгого соответствия XHTML, Вам нужен CDATA так же, меньше, чем и амперсанды не отмечаются как недопустимые символы.

42
задан Daniel Fortunov 23 July 2009 в 09:50
поделиться

4 ответа

EasyMock не поддерживает это, поэтому вы застряли в резерве временного интерфейса.

Кроме того, я чувствую запах кода - действительно ли метод обработки объекта как двух разных вещей, в данном случае интерфейса Foo и Closeable ?

Это подразумевает для меня, что метод выполняет несколько операций, и хотя я подозреваю, что одна из этих операций заключается в «закрытии» Closeable , не имеет ли смысл для вызывающего кода решать, следует ли или не обязательно "закрыть"?

Такое структурирование кода сохраняет «открытые» и «закрытые» в той же попытке ...

10
ответ дан 26 November 2019 в 23:29
поделиться

думали ли вы о чем-то вроде:

interface Bar extends Foo, Closeable {
}

, а затем имитируете панель интерфейса?

14
ответ дан 26 November 2019 в 23:29
поделиться

Насколько мне известно, единственный инструмент имитации для Java, который имеет явную поддержку имитации нескольких интерфейсов, - это JMockit . (Мое вдохновение для добавления этой функции пришло из Moq и Rhino Mocks, которые являются инструментами .NET.)

Пример (из тестового класса mockit.ExpectationsUsingMockedTest JUnit 4):


@Test
public <M extends Dependency & Runnable> void mockParameterWithTwoInterfaces(final M mock)
{
   new Expectations()
   {
      {
         mock.doSomething(true); returns("");
         mock.run();
      }
   };

   assertEquals("", mock.doSomething(true));
   mock.run();
}

Dependency и Runnable - это интерфейсы. Метод doSomething принадлежит первому, а метод run - второму.

2
ответ дан 26 November 2019 в 23:29
поделиться

Although I fundamentally agree with Nick Holt's answer, I thought I should point out that mockito allows to do what you ask with the following call :

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

Obviously you'll have to use the cast: (Bar)mock when you need to use the mock as a Bar but that cast will not throw ClassCastException

Here is an example that is a bit more complete, albeit totally absurd:

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) {
        }
    }
72
ответ дан 26 November 2019 в 23:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: