Как тщательно протестировать классы, которые используют интерфейсы - PullRequest
0 голосов
/ 08 февраля 2019

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

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

Справочная информация:

В настоящее время я работаю надпроект, в котором я должен реализовать криптографическую конструкцию, которая использует несколько криптографических примитивов (таких как подписи, Mac и т. д.).Цель этой реализации состоит в том, чтобы иметь одну общую реализацию, которая не использует никаких конкретных примитивов, а затем создавать экземпляры примитивов, чтобы конструкция действительно работала.

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

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

Я читал о Mockito, но большинство примеров просты, когда Mockito моделирует базу данных, и я не знаю, является ли Mockito по-прежнему лучшим способом тестирования в моем случае,особенно если я хочу смоделировать подписи, где я использую асимметричные ключи.Если я использую Mockito, я представляю, что код становится беспорядочным из-за «встроенного» характера объявлений Mockitos.

Применимо ли Mockito (или Mocks в целом) для такого рода испытаний, или я должен реализовать (базовые) реализации моих интерфейсов?

Пример:

Итак, мой «основной» класс имеет набор алгоритмов:

AlgorithmSet algorithmSet;

Этот набор алгоритмов состоит из AlgorithmFactories

HashFactory HashFactory;
SignatureFactory signatureFactory;
SymmetricKeyFactory keyFactory;

В моем «главном»Класс I называет функции алгоритма похожими на это:

Signature signatureScheme = algorithmSet.getSignatureFactory().getSignature();
SignatureKeyPair keyPair = signatureScheme.generateKey();
SignatureOutput signature = signatureScheme.sign(keyPair.getPrivateKey(), message);

Это лишь небольшой пример, который я собрал ради этого вопроса, так что мой реальный код выглядит немного иначе, но это сутьэтого

Signature, SignatureKeyPair, SignatureOutput - это все интерфейсы, потому что в моем «основном» классе мне все равно, кто они, если они выполняют свое предназначение.

Как лучше всего проверить «основной» класс в моем случае? Является ли Mockito по-прежнему лучшим способом?Или лучше сделать базовые реализации всех интерфейсов для улучшения читабельности?Есть около 5 алгоритмов (каждый с Output, Keys и т. Д.).Или есть другой способ, который мне пока не удалось найти?

Я очень ценю любую помощь и спасибо за чтение!

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Добро пожаловать на борт Stackoverflow!

Если я правильно понял ваш пост, главный вопрос - проверить класс Main.Предполагается, что вы уже успешно протестировали классы конкретных реализаций ваших интерфейсов, фабрик и т. Д.

Если это так, я бы порекомендовал провести рефакторинг вашего класса Main путем извлечения получения экземпляра Signature в отдельныйметод:

class Main {
    ...

    Signature getSignature() {
        algorithmSet.getSignatureFactory().getSignature();
    }

    Signature signatureScheme = getSignature();

    ...
}

Теперь в модульных тестах у вас есть возможность заменить действительный экземпляр Signature на смоделированный.Mockito идеально подходит для этого пути.

class MainTest {
    @Test
    public void testSomething() {
        Signature mockedSignature = Mockito.mock(Signature.class);
        // TODO: define the behavior of the mocked Signature.

        // Given an instance of Main class but with overridden method to get mocked Signature. 
        Main customMain = new Main() {
            @Override
            Signature getSignature() {
                return mockedSignature;
            }
        }

        // When
        customMain.doSomething()

        // Then
        // TODO: validate the actual result and mocks interactions.
    }
}
0 голосов
/ 08 февраля 2019

Mockito - это отличная платформа для защиты ваших интерфейсов.

Концептуально существуют разные подходы, обычно различаемые как classical и mockist тестирование.Мартин Фаулер Издевательства не окурки статья является классическим справочником для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...