Проверьте, что метод вызывается с правильными параметрами во всем программном обеспечении - PullRequest
0 голосов
/ 01 июня 2018

Недавно я столкнулся с проблемой, когда метод в моем сервисе был вызван с неправильными параметрами.Это вызвало какой-то сбой, поэтому я думаю о том, как предотвратить это в будущем.

Итак, предполагая, что у меня есть следующий метод:

public boolean doSomething(String param1, String param2);

Я хочу проверить, чтокаждый раз, когда вызывается этот метод (независимо от того, где в моей службе), значение param1 является конкретным (например, только String1, String2 и String3 будет допустимым значением параметра для этого.

Существуют ли какие-либо технологии / библиотеки / инструменты для этого, чтобы проверить это, например, в модульном тесте?

Обновление: , как предполагает принятый ответ, это то, что не должно рассматриватьсямодульные тесты, так как модульные тесты предназначены для поведенческого тестирования. Что может предотвратить неправильный вызов в будущем, это использовать Preconditions или просто простую проверку параметров.

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Создание модульного теста, который гарантирует, что метод принимает только некоторые значения в качестве параметра param1 во время выполнения.

Код теста с двумя сценариями: допустимый и недействительный регистр.

Например, в JUnit 5:

@Test
public void doSomething(){ 
   Assert.AssertTrue(new Foo().doSomething("String1", "anyValue");
   Assert.AssertTrue(new Foo().doSomething("String2", "anyValue");
   Assert.AssertTrue(new Foo().doSomething("String3", "anyValue");
}

@Test
public void doSomething_with_illegal_argument(){ 
    Assert.assertThrows(IllegalArgumentException.class, () -> new Foo().doSomething("invalidValue", "anyValue"));
}

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

Например:

public boolean doSomething(String param1, String param2) {
    if (!"String1".equals(param1) &&
        !"String2".equals(param1) &&
        !"String3".equals(param1) {
        throw new IllegalArgumentException("param1 should be ...");
    }
   ... // processing
}

Я бы добавил, что тестовая единица не может охватить все неудачные случаи, если неисправные случаи - это любые String, но 3 специфических String s: это миллионывозможностей.

В вашем случае я думаю, что лучший способ сделать ваш код более устойчивым - это использовать ограниченный тип в качестве перечисления.Вы можете определить перечисление, которое содержит 3 значения, и предоставить конструктору перечисления значение String, фактически переданное в качестве параметра.

Это может выглядеть так:

public boolean doSomething(MyEnum param1Enum, String param2){
   ...
   String param1 = param1Enum.getString();
}
0 голосов
/ 01 июня 2018

Когда это возможно, вы должны использовать проверки во время компиляции , а не откладывать тесты во время выполнения.Если есть только три допустимых значения, то, возможно, param1 должно быть enum, а не String.

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

public boolean doSomething(String param1, String param2) {
    if (!Objects.equals(param1, "String1") &&
        !Objects.equals(param1, "String2") &&
        !Objects.equals(param1, "String3"))
    {
        throw IllegalArgumentException("param1 must be String1, 2, or 3");
    }

    ...
}

Guava's Класс предварительных условий может быть полезен.

public boolean doSomething(String param1, String param2) {
    Preconditions.checkArgument(
        Objects.equals(param1, "String1") ||
        Objects.equals(param1, "String2") ||
        Objects.equals(param1, "String3"),
        "param1 must be String1, 2, or 3"
    );

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