Как я могу использовать jUnit для тестирования класса, использующего синглтон?

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

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


person MikeKusold    schedule 01.07.2010    source источник


Ответы (2)


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

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

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

person Brian Agnew    schedule 01.07.2010
comment
Обязательно: одиночки — патологические лжецы googletesting.blogspot.com/2008/08/ и Куда делись все синглтоны? misko.hevery.com/2008/08 /21/куда-де-все-одиночки-делись - person matt b; 01.07.2010
comment
Guice также является отличной DI-библиотекой и ориентирована только на DI. - person ColinD; 01.07.2010

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

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

person Shekhar    schedule 01.07.2010