2010-07-01 7 views
0

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

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

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 является Регистр назначения. (aka R0, R1, ... R7) SR1num является исходным регистром

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

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

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

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

ответ

5

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

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

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

+2

Обязательно: «Одиночки патологические лжецы» http://googletesting.blogspot.com/2008/08/by-miko-hevery-so-you-join- new-project.html и «Где все синглтоны ушли?» http://misko.hevery.com/2008/08/21/where-have-all-the-singletons-gone/ –

+1

Guice также является большой библиотекой DI и ориентирован только на DI. – ColinD

+0

@Matt - хорошие ссылки.Спасибо –

0

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

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

Смежные вопросы