2013-07-28 1 views
0

Мне нужна помощь, чтобы наилучшим образом выполнить модульный тест на метод сохранения и чтения объекта. Это простой объект, здесь конструктор:Junit Test для метода сохранения и чтения объекта

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) throws IOException; 
    public Bill read() throws IOException; 

И нести со мной, это конкретная реализация выше интерфейс

public class BillSvcImpl implements IBill { 

    @Override 
    public void save(Bill bill) throws IOException { 
     FileOutputStream fOut = null; 
     ObjectOutputStream oOut = null; 

     try { 
      fOut = new FileOutputStream("firstbill.ser");   
      oOut = new ObjectOutputStream(fOut); 
      oOut.writeObject(bill); //serializing Bill object 

     } catch (IOException e) { 
      e.printStackTrace(); 

      try{ 
       oOut.flush(); 
       oOut.close(); 
       fOut.close(); 
      }catch (IOException ioe){ 
         ioe.printStackTrace(); 
      } 
     } 
    } 



    @Override 
    public Bill read() { 

     Bill retrievedBill = null; 
     FileInputStream fIn = null; 
     ObjectInputStream oIn = null; 

     try{ 
      fIn = new FileInputStream("firstbill.ser");   
      oIn = new ObjectInputStream(fIn);   
      retrievedBill = (Bill)oIn.readObject(); 

     }catch (ClassNotFoundException cnf){ 
        cnf.printStackTrace(); 
     }catch (IOException e){ 
      try{ 
       oIn.close(); 
       fIn.close(); 
      }catch (IOException ioe){ 
       ioe.printStackTrace(); 
      } 
     } 
     return retrievedBill; 
    } 

    } 

и, наконец, вот тест, который я хотел бы использовать, чтобы проверить этот метод и он не

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

} 
@test 
public void testSaveBill(){ 
    IBill bill = factory.getBillInfo(); 
    Bill nanny = new Bill("Nanny",128d,new Date(6/28/2013),"Montly"); 
    try { 
     bill.save(nanny); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

@test 
public void testReadBill(){ 
    IBill rbill = factory.getBillInfo(); 
    try { 
     rbill.read(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

}

Я знаю, что мой тест не правильно, поэтому, пожалуйста, помогите мне повторно написать свой тест. Сообщение об ошибке Java.lang.Exception: No runnable method

+1

тест, вероятно, даже не компилировать, потому аннотацию, как и все классы в Java, написано '@ Test', а не' @ test'. Кроме того, не проверяйте исключения в методах тестирования. Если у вас есть исключение, вы хотите, чтобы ваш тест потерпел неудачу, а не преуспеть. Методы записи и чтения должны также вызывать исключение, а не ловить их. Вы не хотите, чтобы ваша программа продолжалась, как будто ничего плохого не произошло, когда при письме или чтении счета было выбрано исключение. И потоки должны быть закрыты, что бы ни случилось, в конце блока. –

+0

Благодарим вас за отзыв, я должен был упомянуть, что это мой первый реальный набег на Java. Во всяком случае, я применил вашу обратную связь (изменил \ @test на \ @Test, удалил try/catch из методов чтения/записи, и тест прошел успешно. Еще раз спасибо за ваши отзывы –

ответ

0

Если вы используете JUnit 4.x, то вам необходимо отметить свой метод с @Test аннотаций (к регистру) для 3.x класса Test должен extends TestCase для того, чтобы сделать тестовые работы.

Если вы проектируете модульный тест, вам не нужно фактически сериализовывать свой объект, а затем десериализовать его. Я двигаюсь бы и ObjectInputStream oIn на уровне класса атрибутов с get/set методов и напускной их в тесте (Есть несколько хороших Mock Framework реализации 1, 2)