Тестирование void методов с помощью JUnit

229
11 февраля 2018, 00:06

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

public class IntegerDivision {
public static void main(String[] args) throws IOException {
IntegerDivision integerDivision = new IntegerDivision();
try(BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));) {
    int dividend = integerDivision.read(reader);
    int divider = 0;
    int attempNumber = 0;
    while (divider == 0) {
    if (attempNumber != 0) {
        System.out.println("Сan not be divided into zero");
    }
    divider = integerDivision.read(reader);
    }      
    integerDivision.divide(dividend, divider);
}
}
public void divide(int dividend, int divider) {
    int lineCount = 1;
    int result = 0;
    int dividendRemainder = 0;
    int elementCount = 0;
    int dividendPart = 0;
    int subtractedDigit = 0;
    System.out.println("_" + dividend + " | " + divider);
    lineCount++;
    String dividendString = String.valueOf(dividend);
    String[] dividendDigits = dividendString.split("");
    while (elementCount < dividendDigits.length) {
        if (elementCount == 0) {
            dividendPart = Integer.parseInt(dividendDigits[elementCount]);
        } else {
            dividendPart = Integer.parseInt(String.valueOf(dividendPart) + dividendDigits[elementCount]);
        }
        if (dividendPart >= divider) {
            result = dividendPart / divider;
            dividendRemainder = dividendPart % divider;
            subtractedDigit = result * divider;
            if (lineCount == 2) {
                display(dividend, divider, lineCount);
            } else {
                display(dividendPart, subtractedDigit, lineCount);
            }
            dividendPart = dividendRemainder;
            lineCount++;
            elementCount++;
        } else {
            elementCount++;
        }
    }
    lineCount = 0;
    display(dividend, dividendRemainder, lineCount);    
}
/* Выводит результат в консоль в виде
    78945|4
    4    |------
    -----|19736
    38
    36
     29
     28
      14
      12
       25
       24
        1*/
public void display(int firstNumber, int secondNumber, int lineNumber) {
   ...............
        System.out.println(stringBuilder.toString());
    }
}
public  int count(int number) {
    ........
    return numberString.length();
}
public String collect(int symbolsNumber, char symbol) {
   ........
    return string.toString();
}
private int read(BufferedReader reader) throws IOException {
.......
return Integer.parseInt(readedLine);
}

}

Answer 1

Переменная out в классе System статичная, поэтому перед запуском теста можно подменить поток вывода в консоль на свой:

 protected final ByteArrayOutputStream output;
 private PrintStream old;
 @Before
 public void setUpStreams() {
  old = System.out;
  output = new ByteArrayOutputStream();
  System.setOut(new PrintStream(output));
 }
 @After
 public void cleanUpStreams() {
  System.setOut(old);
 }

 @Test
 public void testString() {
  IntegerDivision division = new IntegerDivision();
  division.divide(17.0, 23.0);
  String template = "ожидаемый вывод в консоль";
  Assert.assertEquals(template, output.toString());
 }
READ ALSO
Заполнение массива из файла

Заполнение массива из файла

Не могу понять как

230
java apk Ошибка NullPointerException

java apk Ошибка NullPointerException

при запуске приложения получаю ошибку:

247
Функции кнопки в Sketchware

Функции кнопки в Sketchware

Как сделать в Sketchware так что бы кнопка показывала ,а при повторном скрывала какой-либо контент?

317
Объединить две матрицы

Объединить две матрицы

Есть две матрицы:

299