Когда Вы идете для строгого соответствия XHTML, Вам нужен CDATA так же, меньше, чем и амперсанды не отмечаются как недопустимые символы.
EasyMock не поддерживает это, поэтому вы застряли в резерве временного интерфейса.
Кроме того, я чувствую запах кода - действительно ли метод обработки объекта как двух разных вещей, в данном случае интерфейса Foo
и Closeable
?
Это подразумевает для меня, что метод выполняет несколько операций, и хотя я подозреваю, что одна из этих операций заключается в «закрытии» Closeable
, не имеет ли смысл для вызывающего кода решать, следует ли или не обязательно "закрыть"?
Такое структурирование кода сохраняет «открытые» и «закрытые» в той же попытке ...
думали ли вы о чем-то вроде:
interface Bar extends Foo, Closeable {
}
, а затем имитируете панель интерфейса?
Насколько мне известно, единственный инструмент имитации для 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
- второму.
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) {
}
}