2015-02-12 8 views
0

Мне нужно написать единичный тест для некоторых статическихvoid методов с неизвестным/непредсказуемым побочным эффектом. Например,Единичный тест для метода пустоты

public void doSth() { 
    try { 
     HttpPostUtil.sendRequest("abc", "xyz"); 
    } catch(Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

HttpPostUtil находится в другом файле фляги. Это вне моего контроля, и оно опубликует данные для некоторых веб-сервисов. Какова методология тестирования, которую мы могли бы сделать в этой ситуации? (PowerMockito здесь не допускается :()

+1

Здесь вы можете более или менее ничего сделать. Если вы не можете использовать код, вы не можете перехватить вызов 'sendRequest'. В лучшем случае вы можете изменить 'System.err' и перехватить' printStackTrace', но ваш HTTP-вызов должен был бы как-то свалиться и выбросить исключение. –

+0

Я не понимаю, почему PowerMockito ограничен (на самом деле, вам даже не нужно, если вы уже используете Mockito, когда вы отметили его в вопросе). Во всяком случае, это зависит от того, что вы хотите/нуждаетесь в том, чтобы насмехаться и что вам нужно проверить. Поскольку вы не указали эту точную информацию, вам действительно сложно понять, чего вы хотите/должны выполнить. –

+0

@LuiggiMendoza С помощью 'PowerMockito', будет легко проверить статический метод –

ответ

4

Поскольку недействительно метод единственное, что вы можете проверить это поведение. В такой ситуации у вас есть несколько вариантов

  1. Wrap вызовы HttpPostUtil с объектом для того, чтобы не иметь его как статичный и издеваться над ним в тестах (путем mockito или путем инъекции вашей реализации в ваш объект). Это называется классом sprout.
  2. Оберните вызов HttpPostUtil в метод и переопределите его в наборе тестов на что-то еще .

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

+0

Мне нравится ваш ответ. Это правда, что, когда класс трудно тестировать, реализация является плохим и нуждается в рефакторинге. Фактически, мы сейчас пытаемся сделать много рефакторинга с удалением методов 'static' и добавим больше инъекций в класс. Upvote! –

0

При тестировании метода вы всегда должны просто проверить этот метод и высмеять другие вызовы другим методам. Потому что другие методы должны были быть протестированы в их собственных методах тестирования.

Здесь вам просто нужно 2 теста, если вы также хотите проверить ловушку. С Mockito:

@InjectMocks 
private YourClass yourClass; 

@Mock 
private HttpPostUtil httpPostUtil; 

@Test 
public void testDoSthPositive() { 
    // Run Test 
    yourClass.doSth(); 

    // Control 
    verify(httpPostUtil).sendRequest("abc", "xyz"); 
    verifyNoMoreInteractions(httpPostUtil); // Optional 
} 

@Test 
public void testDoSthNegative() { 
    // Preparation 
    NullPointerException exceptionMock = mock(NullPointerException.class); 
    doThrow(exceptionMock).when(httpPostUtil).sendRequest("abc", "xyz"); 

    // Run Test 
    yourClass.doSth(); 

    // Control 
    verify(exceptionMock).printStackTrace(); 
    verifyNoMoreInteractions(exceptionMock, httpPostUtil); // Optional 
} 
+0

Пожалуйста, внимательно прочитайте вопрос, 'HttpPostUtil' вызывает статический метод –

+0

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

+0

Извините, я должен прояснить ситуацию. Я думал, что каждый должен знать, что когда StackOverflow выделяет слово, тогда это слово должно быть классом, а не объектом;). Во всяком случае, исправлено !!! –

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