Что вы называете внутренним классом, используемым для тестирования? - PullRequest
1 голос
/ 31 августа 2011

В нашей команде есть участники, которые только начинают наращивать модульное тестирование, и мы боремся с некоторой терминологией. Я хотел бы определить имя для конкретного шаблона. Я надеюсь, что есть один, который уже принят другими разработчиками, но если нет, я бы хотел придумать тот, который будет описательным и облегчит обсуждение стратегий тестирования.

Этот шаблон довольно часто используется для тестирования абстрактных методов, но также удобен, когда объект создает новый объект (для случаев, когда DI не работает или нежелателен). Основной шаблон заключается в использовании внутреннего класса, расширяющего тестируемый класс, для предоставления защищенных методов.

Рассмотрим следующий код (псевдокод, основанный на Java, но должен переводиться на большинство языков):

Класс для тестирования:

public class MyClass {
  public void send() {
    //do something
  }
  protected MailMessage createNewMailMessage() {
    return new MailMessage();
  }
}

Тест:

public class MyClassTest {
  private MyClass myClass = new TestableMyClass();
  private MailMessage mockMessage = mock(MailMessage.class);

  public void setup() {
    ((TestableMyClass)myClass).setMailMessage(mockMessage);
  }

  // Do some tests //

  private class TestableMyClass extends MyClass {
    private MailMessage mailMessage;

    public void setMailMessage(MailMessage mailMessage) {
      this.mailMessage = mailMessage;
    }

    protected MailMessage createNewMailMessage() {
      return mailMessage;
    }
  }
}

Итак, как вы называете эту модель? TestableMyClass - «Mock» -объект, но поскольку он не управляется фальшивой структурой, похоже, что для описания этого паттерна должен быть другой термин Есть предложения или идеи?

Ответы [ 3 ]

0 голосов
/ 31 августа 2011

Вам не нужно использовать фальшивый фреймворк для вызова объекта Mock / Stub - ваш MyClassTest (который, как я предполагаю, должен расширять MyClass) - это просто Stub.

Я неНе думаю, что есть конкретное имя для случая, когда Mocks / Stubs определены как внутренние классы вашего тестового класса - и в данном конкретном примере нет причин для того, чтобы он был внутренним классом - это может быть просто класс, защищенный пакетом (в том же файле, что и MyClassTest, или в отдельном файле ..)

0 голосов
/ 31 августа 2011

Макет содержит тестовые утверждения.

Stub предоставляет простые жестко запрограммированные значения для выполнения теста.

Поддельный обеспечивает сложное поведение / ответы.

Я обычно добавляю два подчеркивания с префиксом внутреннего класса для тестирования, чтобы он не отображался при автозаполнении, например '__TestableMyClass. Кроме того, если вы используете Mockito, вы должны быть ошеломлены так

MyClass myClass = mock(MyClass.class);
when(myClass.createNewMailMessage()).thenReturn(mockMessage);
0 голосов
/ 31 августа 2011

Я бы назвал это окурком. Как вы сказали, это не настоящий «макет», поскольку его поведение не контролируется фальшивой структурой, а является «истинным» объектом.

...