2016-10-08 2 views
3

Я пишу модульный тест для устаревшего кода Java. Теперь я столкнулся с проблемой. Ниже приведено class A. Я хочу написать тестовый код.Как написать тестовый код для тестирования кода обработки исключений?

class A { 

    public A(){ 

    } 

    public void doSomething()throws DBException { 
     try{ 
      //some code that might throw JDBCConnectionException 
     }catch(JDBCConnectionException e){ 
      notifyJDBCConnection() 
     }catch(Exception e){ 

     } 
    } 

    private void notifyJDBCConnection(){ 
     //do notification stuff 
    } 
} 

Теперь предположим, что, если мне нужно, чтобы проверить, является ли метод notifyJDBCConnection() был выполнен, когда JDBCConnectionException ловится. Каков правильный подход к решению этой проблемы? Или я должен просто написать тест для тестирования метода notifyJDBCConnection в порядке?

+0

Почему 'notifyJDBCConnection' является общедоступной? Вызывается ли он из другого класса? – saka1029

+0

@ saka1029 Да, я думаю, вы правы. Он вызывается только из класса «А» и не должен быть «публичным». – kenshinji

+0

Спасибо за удивительное согласие ;-) – GhostCat

ответ

0

Один способ приближения к этому:

  1. Ставит ответственность обработки что исключение в свой класс.
  2. Затем вы используете зависимую инъекцию, чтобы предоставить объект этого класса классу A.
  3. Теперь вы можете использовать насмешливый рамки, такие как EasyMock или Mokito передать экземпляр этого класса обработчика исключений издевались в А.
  4. Наконец, вы убедитесь, что издевались над объектом видит ожидаемые вызовы.

Этот подход может выглядеть как «больше работы» на поверхности, но это может привести к лучшему дизайну - поскольку вы разделяете проблемы; и, создав специальный класс обработчика исключений, вы можете проверить , что класс тоже!

1

Я предполагаю, что notifyJDBCConnection вызовет какую-либо структуру уведомлений, будь то отправитель электронной почты или иным образом. Если вы издеваетесь над этим компонентом с помощью фреймворка, например Mockito, вы можете убедиться, что соответствующие вызовы упомянутого компонента выполнены.

+0

Да. Значит ли это, что мне не нужно писать тестовый код, чтобы покрыть логику от блока try до блока catch, включая часть обработки исключений? Все, что мне нужно сделать, это использовать Mockito для тестирования компонента уведомления, верно? – kenshinji

+0

Ну, вам нужно как-то вызвать метод уведомления. Вызывает ли это объект JDBC, который вы можете высмеять? –

+0

Вы имеете в виду 'notifyJDBCConnection'? Нет, он отвечает только за отправку сообщений другим компонентам. – kenshinji

0

Раствор с помощью Mockito и JUnit с проектом, предложенным GhostCat:

class A { 
    private final JDBCConnectionNotifier notifier; 

    public A(JDBCConnectionNotifier notifier){ 
     this.notifier = notifier; 
    } 

    public void doSomething()throws DBException { 
     try{ 
      //some code that might throw JDBCConnectionException 
     }catch(JDBCConnectionException e){ 
      notifier.notifyJDBCConnection() 
     }catch(Exception e){ 

     } 
    } 
} 

Так класс Волд тест быть:

import static org.mockito.Mockito.*; 
import org.junit.*; 

class ATest { 
    @Test 
    public void shouldCallNotifierOnJDBCConnectionException() throws Exception { 
     JDBCConnectionNotifier notifier = mock(JDBCConnectionNotifier.class); 
     A a = new A(notifier); 

     a.doSomething(); 

     verify(notifier).notifyJDBCConnection(); 
    } 
} 

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

  • Нет связанных вопросов^_^