Модульное тестирование статическим методом - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь написать тестовый пример для метода расшифровки здесь.

    private static Codec codec;

    static {
        try {
            codec = new Codec(encryptionType, encryptionKey, false, true, false);
        } catch (CodecException e) {
            throw new RuntimeException("Codec initialisation failed", e);
        }
    }


    public static String decrypt(final String toDecrypt) throws CodecException {
        String decrypted = codec.decryptFromBase64(toDecrypt);
        if (decrypted.endsWith(":")) {
            decrypted = decrypted.substring(0, decrypted.length() - 1);
        }
        return decrypted;
    }

Тестовый пример:

    @Mock
    private Codec codec;
    @Test
    public void test_decrypt_Success() throws CodecException {
        when(codec.decryptFromBase64(TestConstants.toDecrypt)).thenReturn(TestConstants.decrypted);
        assertEquals(DocumentUtils.decrypt(TestConstants.toDecrypt), TestConstants.decrypted);
    }

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

Каков ваш подход к тестированию статических методов, подобных этому?Или я вообще не должен писать тесты для этого?

Ответы [ 3 ]

0 голосов
/ 10 декабря 2018

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

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

Для получения дополнительной справки: Зачем использовать синглтон вместо статических методов?

Для справки о том, почему статический следует использовать осторожно: - Почему статические переменные рассматриваютсязло?

0 голосов
/ 10 декабря 2018

В Java статические методы не предназначены для установки зависимостей.
Так что переключение зависимости в макет на самом деле не является естественным.
Вы можете предоставить static установщик для поля, такой как:

private static Codec codec;
public static void setCodec(Codec codec){
   this.codec = codec;
}

И вы можете установить макет с помощью setCodec(...) но тьфу ...

Но забудьте, просто делайте все хорошо: реорганизуйте код, чтобы удалить все статические, и представьте конструктор, который устанавливает кодек,

private Codec codec;
public MyClassUnderTest(Codec codec){
   this.codec codec;
}

Здесь МОК может помочь сделать тестируемый класс одноэлементным и упростить внедрение зависимостей.
Если это невозможно в вашем случае, перечисление Java 5 может помочь вам, по крайней мере, для одноэлементной задачи.

0 голосов
/ 10 декабря 2018

По своему опыту в этих случаях я просто готовлю все экземпляры в методе @Before:

private Codec codec;

@Before
public void setup() throws CodecException {
  codec = new Codec(encryptionType, encryptionKey, false, true, false);
}
...