JUnit: Как моделировать тестирование System.in?

Одна из вещей около вершины мой "к - действительно" перечисляет для PBS, должен портировать внутренний протокол Google Буферный сравнительный тест производительности - это - главным образом случай взятия конфиденциальных форматов сообщения и превращения их в совершенно мягкие и затем выполнение того же для данных.

, Когда это было сделано, я предположу, что Вы могли создать те же сообщения в Экономии и затем сравнить производительность.

, Другими словами, у меня еще нет данных для Вас - но надо надеяться за следующие несколько недель...

48
задан informatik01 28 December 2013 в 23:03
поделиться

4 ответа

Технически возможно переключить System.in , но в целом это было бы более надежно не вызывать его непосредственно в вашем коде, но добавить уровень косвенности, чтобы источник ввода контролировался из одной точки в вашем приложении. Как именно вы это делаете, является деталью реализации - предложения по внедрению зависимостей хороши, но вам не обязательно вводить сторонние фреймворки; вы можете, например, передать контекст ввода / вывода из вызывающего кода.

Как переключить System.in :

String data = "Hello, World!\r\n";
InputStream stdin = System.in;
try {
  System.setIn(new ByteArrayInputStream(data.getBytes()));
  Scanner scanner = new Scanner(System.in);
  System.out.println(scanner.nextLine());
} finally {
  System.setIn(stdin);
}
61
ответ дан 26 November 2019 в 18:47
поделиться

Попробуйте провести рефакторинг кода, чтобы использовать внедрение зависимостей . Вместо того, чтобы иметь метод, который напрямую использует System.in , пусть этот метод принимает в качестве аргумента InputStream . Затем в своем тесте junit вы сможете пройти тестовую реализацию InputStream вместо System.in .

5
ответ дан 26 November 2019 в 18:47
поделиться

Есть несколько способов приблизиться к этому. Самый полный способ - передать InputStream при запуске тестируемого класса, который является поддельным InputStream, который передает смоделированные данные вашему классу. Вы можете взглянуть на структуру внедрения зависимостей (такую ​​как Google Guice), если вам нужно много делать это в вашем коде, но простой способ:

 public class MyClass {
     private InputStream systemIn;

     public MyClass() {
         this(System.in);
     }

     public MyClass(InputStream in) {
         systemIn = in;
     }
 }

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

8
ответ дан 26 November 2019 в 18:47
поделиться

Одно из применений static_assert может заключаться в том, чтобы гарантировать, что структура (то есть интерфейс с внешним миром, например сеть или файл) имеет именно тот размер, который вы ожидать. Это позволит выявить случаи, когда кто-то добавляет или изменяет член структуры, не осознавая последствий. static_assert поднимет его и предупредит пользователя.

InputStream in = System.in;
...
Scanner scanner = new Scanner( in );

После:

InputStream in = new FakeInputStream();
...
Scanner scanner = new Scanner( in );

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

1
ответ дан 26 November 2019 в 18:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: