Модульное тестирование с использованием Mockito или JMock - PullRequest
0 голосов
/ 28 мая 2011

Модульное тестирование:

У меня есть следующие классы

public class BImpl extends AImpl
{
    public BImpl(final C c) 
    {
        super(c);
    }

    public String getInfo()
    {
       final String info = getInformation();
       // Do all my logic here
       return info;
    }
}

public abstract class AImpl
{
    public String getInformation()
    {
    // some logic...returns String.
    }
}

Я пытаюсь выполнить модульное тестирование метода getInfo (), используя любой из методов насмешки, доступных либо Mockito, либо JMock.

например, при использовании Mockito я использую этот способ:

final AImpl aImpl = mock(AImpl.class);
when(aImpl.getInformation()).thenReturn("ABC");

Теперь, так как мне нужно создать экземпляр BImpl, единственный способ, которым я могу создать, - это использовать конструктор.

final BImpl bImpl = new BImpl (C);
bImpl.getInfo();

когда он вызывает метод getInfo () и пытается вызвать getInformation (), он вызывает не проверяемый объект, а фактический.

Какой хороший способ проверить этот метод. Есть ли другой способ создать экземпляр BImpl, не используя конструктор, который я дал выше?

Спасибо !!

1 Ответ

2 голосов
/ 28 мая 2011

ИМХО, это не проблема с насмешливыми библиотеками, а с вашим дизайном.Вы хотите проверить метод getInfo(), посмеиваясь над getInformation(), от которого он зависит.Модульное тестирование метода, имитирующего все его зависимости, - верный путь, и все фреймворк-фреймворки поддерживают его довольно хорошо.Итак, почему вы испытываете эти проблемы?

Потому что вы выбрали наследование там, где композиция действительно была необходима.Вы злоупотребляете наследованием, чтобы реализовать использует отношение, тогда как оно должно быть составным.Наследование от класса просто для удобного доступа к его методам вызывает проблемы.Подумайте о расширении EntityManager каждым репозиторием / DAO ...

Вы должны сначала выполнить рефакторинг своего кода, чтобы BImpl содержал AImpl и последний был каким-то образом введен.Затем вы можете позволить некоторой DI-структуре выполнять внедрение в производственный код (или делать это самостоятельно) с реальной реализацией, внедряя mock в модульный тест.

...