2013-07-21 3 views
-1

Я следую устаревшему учебнику Java, который учит концепции уровня сервиса, моя программа - очень простая программа, которая создаст список счетов и их сроки. Где я застрял в создании JUnit Test для заводских методов.Создание модульных тестов для заводского метода

Сначала вот Билл Constructor

public Bill(String bname, Double bamount, Date bdate, String bfrequency){ 
this.billName = bname; 
this.billAmount = bamount; 
this.billDueDate = bdate; 
this.frequency = bfrequency; 
} 

Далее это интерфейс, чтобы сохранить и получить эти счета

public interface IBill { 
    public void save(Bill bill); 
    public Bill read(Bill readbill); 


} 

медведя со мной, рядом есть конкретная реализация интерфейса, которые затушили пока что ничего не сделано

public class BillSvcImpl implements IBill { 

    @Override 
    public void save(Bill bill) { 
     System.out.println("Entering the Store BillInfo method"); 

    } 

    @Override 
    public Bill read(Bill readbill) { 
     System.out.println("Entering the Read BillInfo method"); 
     return null; 
    } 

} 

Тогда есть факто Метод чень, который будет создавать/вызвать конкретную реализацию

public class Factory { 

    public IBill getBillInfo(){ 
     return new BillSvcImpl(); 
    } 

}

Затем, наконец, тест JUnit, где я stucked

public class BillSvcTest extends TestCase { 
    private Factory factory; 

    @Before 
    public void setUp() throws Exception { 
     super.setUp(); 
     factory = new Factory(); 

    } 
    @test 
    public void testSaveBill(){ 
     IBill bill = factory.getBillInfo(); 
     Bill nanny = new Bill("Nanny",128d,new Date(6/28/2013),"Montly"); 
     bill.save(nanny); 
     //what goes here??, Assert?? 

    } 

    @test 
    public void testReadBill(){ 
    //How can I write a Test for this?? 
     //Please help 
    } 

} 

Инструкция является

Создать Тест JUnit для вашей службы. Тест должен использовать Factory to получить сервис, созданный в методе setUp().

Моя служба/интерфейс имеет два метода сохранения и получить, как я могу создать тест для них, прежде чем начать фактическую реализацию.

Любая помощь приветствуется. Thanks

ответ

1

IMO save метод должен вернуть что-то сказать, был ли сохранен Bill. Я сохранил бы сохранить метод как этот

public boolean save(Bill bill) { 
    System.out.println("Entering the Store BillInfo method"); 
    boolean result = false; 
    try { 
     //..... saving logic 
     result = true; 
    } 
    catch(Exception e) { 
     result = false; 
     e.printStackTrace(); 
    } 
    return result; 
} 

и сделал Assert в TestCase, как

@Test 
public void testSaveBill(){ 
    //Success 
    IBill bill = factory.getBillInfo(); 
    Bill nanny = new Bill("Nanny",128d,new Date(6/28/2013),"Montly"); 
    assertTrue(bill.save(nanny)); 

    //Failure 
    assertFalse(bill.save(null)); 
} 
+0

спасибо, дайте мне попробовать, что снова –

+0

Спасибо за вашу помощь @sanbhat, ваша помощь работала для спасения, тот же метод не работает для тестирования моего метода чтения. –

+0

Если вы хотите, чтобы тест завершился неудачно, потому что выбрано исключение, вы можете проверить это в тесте или просто дать ему сбой. Попытка конвертировать исключения в булевы только увеличивает сложность. – fgb

3

Во-первых, don't extend TestCase - вместо того, чтобы использовать JUnit 4.x.

Во-вторых, я испытываю большой омрачок против метода с побочными эффектами. Нет причин для изменения вашего метода save для возврата boolean вместо void; вам просто нужно принять альтернативный подход к тестированию метода.

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

Главный вопрос, на который вы хотите ответить, когда вы тестируете устройство: «Каков ожидаемый результат этого вызова метода с учетом этого параметра?» Когда мы звоним save, что мы ожидаем?Мы пишем в базу данных? Мы сериализуем содержимое и записываем в файл? Мы пишем текст XML/JSON/обычный текст? Сначала нужно было бы ответить, а , затем, мог бы быть написан полезный тест.

То же самое относится к read - что я ожидаю получить в качестве входных данных при попытке прочитать счет? Что я получу от прохождения объекта Bill и возврата объекта Bill? (Почему у внешнего звонящего есть понятие законопроекта, который я пытаюсь прочитать?)

Вы должны воплотить свои ожидания в отношении этих методов. Вот подход я использую, чтобы писать тесты:

  • Учитывая конкретный вход,
  • когда я называю этот метод,
  • тогда Я ожидаю, что эти вещи, чтобы быть правдой.

У вас должно быть определить ваши ожидания прежде чем вы сможете написать модульные тесты.

+0

Ничего себе, спасибо человеку. Вероятно, самый сжатый учебник, который я видел при модульном тестировании. Я сохранил ваш ответ в Evernote для упрощения ссылки –

0

Как правило, реализация read() и store() предполагает интеграцию с внешней системой, такой как база данных, файловая система. Это заставляет тест идти рука об руку с внешней системой.

@Test 
public void insertsBillToDatabase() { 
    //setup your database 

    bill.store(aBill); 

    //fetch the inserted bill then assert 
} 

Эти тесты сосредоточены на том, выполняет ли ваш компонент правильное абстрагирование во внешней системе.

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

public void store(Bill bill) { 
    //business logic 
    billDao.save(bill); // delegate to an injected dao, you can replace it with a test double in test code 
} 

@Test 
public void doesSthToBillBeforeSave() { 
    //replace your billDao with a stub or mock 

    bill.store(aBill); 

    //assert the billDao stub/mock are correctly invoked 
    //assert bill's state 
} 
+0

Спасибо, Hippoom, пока я использую сериализацию объектов для сохранения объектов счета и еще не готов подключиться к базе данных, но ваше объяснение имеет смысл, и я вернусь к ссылке когда я дойду до точки DAO/DI –

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