2015-08-21 2 views
2

У меня есть тестовый класс интерфейса, который реализует другой суперкласс. В тестовом классе у меня есть метод, который должен обновлять объект из списка массивов; сначала он должен проверить, находятся ли объекты в списке, если он есть, он удалит и добавит новый объект (заменит). Если он не сможет найти объект, он выдает сообщение об исключении. Вот код, который я внедрил:Обновление JAVA объекта объекта ArrayList не обновляется

Прежде всего, я не знаю, правильно ли это сделать. И, когда я проверить его с моим клиентским скриптом теста, я получаю ошибку, которая гласит:

Exception in thread "main" productdb.util.AssertionFailedError: should've gotten ProductNotFoundException 

Кода для тестового клиента выглядит следующим образом:

ipod.setId(Integer.MAX_VALUE); 
    try { 
     productDB.updateProduct(ipod); 
     Assert.fail("should've gotten ProductNotFoundException"); 
    } catch (ProductNotFoundException pnfe) { 
     // expecting this 
    } 

Пожалуйста, помогите мне определить мою ошибку. Благодарю.

Последняя EDIT Я обновил мой код, основанный на обратной связи я получал RE первого пункта бросали ошибку:

public void updateProduct(Product product) throws ProductNotFoundException 
    { 
     // TODO Auto-generated method stub 
     Iterator<Product> pritr = products.iterator(); 
     while(pritr.hasNext()) 
     { 
      Product pr = pritr.next(); 
      System.out.println(pr.getId()); 
      System.out.println(product.getId()); 
      if (pr.getId().equals(product.getId())) 
      { 

       pritr.remove(); 

      } 
      else 
      { 
       throw new ProductNotFoundException("Product Not Found"); 
      } 

     } 
     products.add(product); 

    } 

ДРУГОЙ UPDATE

public void updateProduct(Product product) throws ProductNotFoundException 
{ 
    // TODO Auto-generated method stub 
    Iterator<Product> pritr = products.iterator(); 
    boolean match = true; 
    while(pritr.hasNext()) 
    { 
     Product pr = pritr.next(); 
     if (pr.getId().equals(product.getId())) 
     { 

      pritr.remove(); 

     } 
     else 
     { 
      match = false; 
     } 

    } 
    if (match == false) 
    { 
     new ProductNotFoundException("Product not found"); 
    } 
    else 
    { 
     products.add(product); 
    } 


} 
+5

Вы бросаете исключение на первом шаге итерации.Как вы думаете, что произойдет, когда нужный элемент будет вторым или последним в списке? –

+0

Так же, как @LuiggiMendoza упоминает - вам нужно пройти через свой код мысленно или на бумаге, так как ваша ошибка должна казаться очевидной. –

+0

Итак, нужно ли сначала перебирать весь список, а затем исключать исключение из цикла while? Извините, если вопросы кажутся немыми, но я думаю, я все еще смущен и пытаюсь понять. – DeeTee

ответ

2

Снова пройдитесь по своей логике. У вас есть это:

public void updateProduct(Product product) throws ProductNotFoundException 
{ 
    // TODO Auto-generated method stub 
    Iterator<Product> pritr = products.iterator(); 
    boolean match = true; 
    while(pritr.hasNext()) 
    { 
     Product pr = pritr.next(); 
     if (pr.getId().equals(product.getId())) 
     { 

      pritr.remove(); 

     } 
     else 
     { 
      match = false; 
     } 

    } 
    if (match == false) 
    { 
     new ProductNotFoundException("Product not found"); 
    } 
    else 
    { 
     products.add(product); 
    } 


} 

, который переводит:

start method 
    set match to true 
    while loop 
     if product found remove original product 
     else match is set to false // this will always happen one or more times! 
    end while loop 

    // match is almost guaranteed to be false! 
    check match. if false, throw exception 
    else if true, add new product 
end method 

Теперь предположим, что данные:

No match 
No match 
No match 
match 
No match 
No match 

И посмотреть, что происходит. С вашей логикой логическое значение будет ложным, если этого не должно быть.

Сравните это с данными, которые должны бросить исключение:

No match 
No match 
No match 
No match 
No match 
No match 

И снова видим, что происходит.

Что вы хотите:

start method 
    set match to false 
    while loop 
     if product found 
      remove original product 
      replace with new product 
      set match to true 
     // no else block needed 
    end while loop 

    check match. if false, throw exception 
    else if true, add new product 
end method 

или

start method 
    // no need for match variable 
    while loop 
     if product found 
      remove original product 
      replace with new product 
      set match to true 
      return from method // ***** 
    end while loop 

    // if we reach this line, a match was never found 
    throw exception 

end method 
+0

В блоке найденного продукта, я использую remove(), а затем добавляет() в 'replace'. Это верно? – DeeTee

+0

@dee попробуйте! Также проверьте изменения в ответе. И снова моя цель - заставить вас пройтись по вашему коду в своем уме. Ничего важнее этого. –

+0

Я сдаюсь. Я пробовал все версии до сих пор не работает. Wow ... – DeeTee

2

Assert.fail выполняется когда не выбрасывается исключение, и это имеет место, если:

  • либо первый (это, кажется, нежелательная ошибка!) Элемент списка (products) имеет равный идентификатор
  • или список (products) пусто

Что содержание списка?

+0

Содержание списка - это объекты типа Product. – DeeTee

+0

@DeeTee - Это не то, что он просил. Он хочет знать, >> какие << объектов в списке, бот их типа. –

+0

Хорошо и * какие ID * эти продукты есть? Результат, похоже, показывает, что один из этих продуктов ** имеет ** * * * * Integer.MAX_VALUE **. –

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