Как я могу использовать jUnit для тестирования класса, который использует синглтон? - PullRequest
0 голосов
/ 01 июля 2010

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

Пример одного из этих классов приведен ниже:

public class Add {
private String cell;

Add() {
    cell = null;
}

/**
 * Method that performs the operation add.
 */
public void addition() {
    // TODO Figure out 2's complement.
    Loader instance = Loader.Instance();
    cell = instance.getCell();

    Integer DR1num = Integer.parseInt(cell.substring(4, 6), 2);
    Integer SR1num = Integer.parseInt(cell.substring(7, 9), 2);

    if (cell.charAt(10) == '0') {
        Integer SR2num = Integer.parseInt(cell.substring(13, 15), 2);
        Integer addedval = instance.getRegister(SR1num)
                + instance.getRegister(SR2num);
        instance.setCCR(addedval);
        instance.setRegister(DR1num, addedval);
    } else if (cell.charAt(10) == '1') {
        Integer immediate = Integer.parseInt(cell.substring(11, 15), 2);
        Integer addedval = instance.getRegister(SR1num) + immediate;
        instance.setCCR(addedval);
        instance.setRegister(DR1num, addedval);
    } else {
        System.err.println("Invalid Char at Position 10. Expected 0 or 1");
    }

    instance.incrementPC();

}

public String getcell() {
    return cell;
}

}

Описание переменных: Экземпляр - это синглтон ячейка - это двоичная строка, которая хранится в массиве памяти DR1num - регистр назначения. (он же R0, R1, ... R7) SR1num - исходный регистр

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

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

Единственный способ, которым я могу думать о тестировании программы, - это написать несколько отдельных файлов для чтения программой. За исключением того, что это означает, что вместо тестирования только одной части моей программы, как минимум, тестируются три класса. Класс, который читает в программе и содержит все методы для синглтона, класс, который определяет, какой класс вызывать, и, наконец, класс, который фактически выполняет эту часть (например, Add).

У кого-нибудь есть предложения по улучшению способа тестирования?

Ответы [ 2 ]

5 голосов
/ 01 июля 2010

Чтобы избежать этого, традиционно используют инверсию управления (IoC) и вводят экземпляр вашего синглтон-класса в класс клиента. Ваш клиентский класс снабжен всеми зависимыми классами, необходимыми для его функционирования, и не связан с жизненным циклом зависимых классов.

Spring - это общая среда Java, используемая для этого, но вы можете внедрить ее, просто создав свой класс со ссылкой на синглтон (это , что просто).

Если класс синглтона реализует интерфейс, то тестирование становится проще, поскольку вы можете вводить макет вариантов, а не реальную реализацию, и создавать свой макет для предоставления подходящих тестовых данных для ваших тестов.

0 голосов
/ 01 июля 2010

Я думаю, что вы можете проверить это, если загрузчик является интерфейсом, а затем с помощью mocking frameowork, такого как EasyMock, вы можете вставить экземпляр mocked-класса вместо реального.

Это будет работать, если Loader является интерфейсом

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