Проверьте аргументы, переданные в приватный метод - PullRequest
0 голосов
/ 04 октября 2018
public class DAO1 {
    private SimpleJDBCall jdbccall;
    @Autowired
    public DAO1(@Qualifier("datasource") DataSource dataSource) {
        jdbccall = createJdbcCall(someparameters)
        }

    public Response fetch(parameters){ 
    jdbccall.execute(parameters);
    }
}

Я хочу протестировать этот класс DAO1, главным образом, если метод execute выполняется с использованием определенных параметров, есть идеи, если это возможно?

Я знаю, что мы можем использовать аргумент captor для открытых методов, но SimpleJDBCallэто личное,

Есть мысли?

1 Ответ

0 голосов
/ 05 октября 2018

Для каждого элемента, взаимодействие которого вы хотите проверить, вы должны использовать внедрение зависимостей .Это хорошее правило для тестирования.

В качестве альтернативы вы можете подумать, если вы можете протестировать результат из jdbccall.execute(parameters), а не только аргументы - это было бы лучшим решением.Каким должно быть состояние системы после того, как execute вызван с правильными аргументами?

Если вы выполняете модульное тестирование и не можете проверить результат execute, тогда вам нужно как-то передать объект типаSimpleJDBCall в конструкторе.Теперь есть три возможности:

  1. Создайте еще один конструктор, который будет принимать DataSource и SimpleJDBCall - тогда вы можете сделать что-то вроде:

    public DAO1(@Qualifier("datasource") DataSource dataSource) {
        this(dataSource, createJdbcCall(someparameters))
    }
    
    public DAO1(DataSource dataSource, SimpleJDBCall jdbccall) {
        this.jdbccall = jdbccall
    }
    
  2. Измените конструктор и добавьте autowired SimpleJDBCall в ваш контейнер (но от имени jdbCall я предполагаю, что это не простое решение)

  3. Измените конструктор (или добавьте еще один) с помощью объектакоторый может создать SimpleJDBCall - это может быть фабрика, это может быть простая функция:

    public DAO1(@Qualifier("datasource") DataSource dataSource, Supplier<SimpleJDBCall> jdbcCallCreator) {
        jdbccall = jdbcCallCreator.get();
    }
    

    или, если это требует аргументов:

    public DAO1(@Qualifier("datasource") DataSource dataSource, Function<ArgumentType, SimpleJDBCall> jdbcCallCreator) {
        jdbccall = jdbcCallCreator.apply(arguments);
    }
    

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

...