Java Абстрактный экземпляр класса или частично реализованный интерфейс - PullRequest
0 голосов
/ 23 июля 2010

У меня есть интерфейс с около 20 (огромными) методами.

Я хочу создать один экземпляр для целей тестирования, но мне нужно переопределить только один метод.Какой хороший способ получить экземпляр этого класса с помощью переопределенного метода без необходимости определять весь класс с тоном методов "// TODO: реализовать это".может предпочесть что-то, что использует рефекцию.Я могу создать фиктивный объект, но тогда я могу переопределить метод в фиктивном объекте?

Ответы [ 4 ]

2 голосов
/ 24 июля 2010

пример использования фреймворка EasyMock Classextension

тестируемый класс:

<code>public class TestClass {
 public boolean dir() {
  return new File("/user/a.txt").exists();
 }</p>

<p>public boolean hasFiles() {
  return dir();
 }}

Тест:

<code>
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;</p>

<p>public class ATest {
 public static void main(String[] args) throws Exception {
  Class class1 = TestClass.class;
  TestClass mock = createMock(class1, class1.getMethod("dir"));
  expect(mock.dir()).andReturn(true).times(2);
  expect(mock.dir()).andReturn(false).times(2);
  replay(mock);</p>

<p>System.out.println("mock.dir()=" + mock.dir());
  System.out.println("mock.hasFiles()=" + mock.hasFiles());</p>

<p>System.out.println("mock.dir()=" + mock.dir());
  System.out.println("mock.hasFiles()=" + mock.hasFiles());
 }
}

Выход:

<code>mock.dir()=true
mock.hasFiles()=true
mock.dir()=false
mock.hasFiles()=false
0 голосов
/ 23 июля 2010

Используйте IDE - они добавят недостающие методы реализации для вас.

В eclipse, если вы создаете класс A, реализующий I, вверху появляется красная отметка, потому что вы не реализовали все методы. Затем вы можете нажать (или забыть правой кнопкой мыши), и он предложит сделать это за вас.

У него все еще будут задачи, но кого это волнует.

Должен сказать, ваш вариант использования звучит немного странно. Почему вы тестируете только один метод?

0 голосов
/ 23 июля 2010

Либо так, либо вы можете просто не беспокоиться о том, что не имеет отношения к вашему тестовому кейсу.В этом случае кажется, что 19 из 20 методов не будут вызываться в любом случае, так зачем беспокоиться о чем-то большем, чем в IDE / editor генерировать заглушки методов по умолчанию?

0 голосов
/ 23 июля 2010

Если у вас есть разумное поведение по умолчанию для всех 20 методов, я бы рекомендовал создать абстрактный класс, реализующий интерфейс. Это то, что делает API java.util. Изучите java.util.List и java.util.AbstractList в качестве примера.

...