Я предпочитаю использовать поддельные классы над mocks (более читаемыми) при модульном тестировании. Это хорошо работало для меня в Python, но в Java-мире мне обычно нужно было создать интерфейс для класса, который я заменяю. Это означает, что вместо 1 класса, теперь у меня 3:Класс фальсификации без интерфейса
- оригинального класс
- интерфейс
- подделки версия для тестирования
Если я хочу, чтобы добиться действительно хорошего тестового покрытия , это фактически означает, что мне нужно сделать это для каждого отдельного класса в моем проекте, что неприемлемо. Я только хочу создать интерфейс для классов, которые действительно будут иметь более одной реализации в производственном коде.
Я заметил, что Mockito позволяет вам издеваться над конкретными классами, не создавая интерфейс. Могу ли я использовать какой-то трюк для поддельных классов?
Например, при тестировании системы регистрации был бы класс электронной почты. Теперь в тесте я фактически не хочу отправлять фактические электронные письма, поэтому я либо издеваюсь, либо подделываю этот класс.
class FakeEmailService {
public void sendEmail(String to, String body) {
m_sent = true;
}
}
Теперь моя система регистрации конструктор принимает исходный класс, EmailService
, но я хотел бы, с какой-то трюк, чтобы использовать FakeEmailService
в тесте:
Registration reg = new Registration(new FakeEmailService());
Это хорошо в Python, так как он не статически типизирован.
Объясните, что такое «поддельный» класс. – chrylis
Не будет ли «EmailService» и «FakeEmailService» еще двумя отдельными классами, даже если у вас не было интерфейса? – Bubletan
зависимые классы должны полагаться на абстракции, а не на конкреции. это позволяет повысить гибкость, так как позволяет вам заменять производственные зависимости фальшивыми/mocks/stubs (выберите ваш яд) при модульном тестировании. он делает зависимый код более SOLID. – Nkosi