2015-04-02 5 views
2

У меня есть блок catch, я хочу выполнить блок catch. Мой файл Класс,Покрытие кода для блоков Catch с использованием EclEMMA

public class TranscoderBean implements TranscoderLocal { 
    public byte[] encode(final Collection<?> entitySet) throws TranscoderException { 
     Validate.notNull(entitySet, "The entitySet can not be null."); 
     LOGGER.info("Encoding entities."); 
     LOGGER.debug("entities '{}'.", entitySet); 

     // Encode the Collection 
     MappedEncoderStream encoderStream = null; 
     ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
     try { 
      // Create the encoder and write the the DSE Logbook messgae 
      encoderStream = new MappedEncoderStream(outputStream, this.encoderVersion); 
      encoderStream.writeObjects(new ArrayList<Object>(entitySet), false); 
      encoderStream.flush(); 
     } 
     catch (Exception e) { 
      LOGGER.error("Exception while encoding entities", e); 
      throw new TranscoderException("Failed to encode entities", e); 
     } 
     finally { 
      if (encoderStream != null) { 
       try { 
        encoderStream.close(); 
       } 
       catch (IOException e) { 
        LOGGER.error("Exception while closing the endcoder stream.", e); 
        throw new TranscoderException("Failed to close encoder stream", e); 
       } 
      } 
     } 
    } 

Мой файл Test Класс,

public class TranscoderBeanTest { 

    private TranscoderBean fixture; 

    @Mock 
    MappedEncoderStream mappedEncoderStream; 
    @Test 
    public void encodeTest() throws TranscoderException { 
     List<Object> entitySet = new ArrayList<Object>(); 
     FlightLog log1 = new FlightLog(); 
     log1.setId("F5678"); 
     log1.setAssetId("22"); 

     FlightLog log2 = new FlightLog(); 
     log2.setId("F5679"); 
     log2.setAssetId("23"); 
     entitySet.add(log1); 
     entitySet.add(log2); 

     MockitoAnnotations.initMocks(this); 
     try { 
      Mockito.doThrow(new IOException()).when(this.mappedEncoderStream).close(); 

      Mockito.doReturn(new IOException()).when(this.mappedEncoderStream).close(); 
     } 
     catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     byte[] encode = this.fixture.encode(entitySet); 
     Assert.assertNotNull(encode); 
    } 
} 

Я попытался, Mockito.doThrow и методы Mockito.doReturn, но до сих пор блок задвижка не выполняется. Что делает неправильно.

ответ

0

Чтобы проверить блок try-catch, вы можете использовать метод TestNG, который состоит в применении метода тестирования со следующей аннотацией expectedExceptions. Код этого метода, вы должны реализовать его, чтобы вызвать это исключение, поэтому будет выполнен блок catch.

Вы можете посмотреть на http://testng.org/doc/documentation-main.html#annotations

+0

Спасибо, но мы используем JUnit и Mockito. – Arasu

+0

То же самое в JUnit. Посмотрите на https://github.com/junit-team/junit/wiki/Exception-testing –

0

Вы уверены, что у вас есть правильный тестовый класс. Я не вижу каких-либо ссылок на TranscoderBean в вашем

+0

Для справок в будущем этот ответ будет лучше в качестве комментария к исходному вопросу. – Rajesh

+0

@Guest добавила ссылку TranscoderBean. – Arasu

+0

Mockito.doThrow (новое IOException()). Когда (this.mappedEncoderStream) .close(); <- Это не сработает, так как вы устанавливаете ожидание на ссылке mappedEncoderStream в классе Test, но фактическое закрытие вызывает mappedEncoderStream в классе TranscoderBean (который в этом случае даже не является издеваемым объектом) – Phoenix

0

Вы ожидаете Mockito делать то, что он не претендует сделать:

Mockito.doThrow(new IOException()).when(this.mappedEncoderStream).close(); 

Это заявление утверждает, что всякий раз, когда кто-то называет close() на mapperEncoderStream-объект получит a IOException. Вы никогда не звоните close.

Попытайтесь добавить mapperEncoderStream.close(); после того, как ваши действия Mockito будут введены, и блок catch будет введен, но обратите внимание: это не поможет вам с вашей проблемой, так как mockito не может помочь здесь.

Для вашей проблемы вы можете рассмотреть следующие альтернативы:

переписывают

encoderStream = new MappedEncoderStream(outputStream, this.encoderVersion); 

в

encoderStream = createMappedEncoderStream(outputStream); 

MappedEncoderStream createMappedEncoderStream(ByteArrayOutputStream outputStream) { 
    return new MappedEncoderStream(outputStream, this.encoderVersion); 
} 

это позволяет вводить издеваться как зависимость.

Затем инициализировать Ваш fixure так:

fixture = new TranscoderBean() { 
    MappedEncoderStream createMappedEncoderStream(ByteArrayOutputStream outputStream) { 
    return mappedEncoderStream; //this is your mock 
    } 
} 

Это впрыскивает Ложная в ваш метод TranscoderBean.encode.

Затем измените макет Аннотация:

@Mock(answer=CALLS_REAL_METHODS) 
MappedEncoderStream mappedEncoderStream; 

Это необходимо, потому что ваш метод кодирования не только называют close на mappedEncoderStream, но и writeObjects и flush. Эти вызовы могут вызывать исключения, поэтому их нужно издеваться или заменять вызовами реального объекта.

подрезать ваш тест как то

@Test(expected=TranscoderException.class) 
public void encodeTest() throws TranscoderException { 
    //... same as above 
    MockitoAnnotations.initMocks(this); 
    Mockito.doThrow(new IOException()).when(this.mappedEncoderStream).close(); 

    this.fixture.encode(entitySet); //this will throw an exception 
} 

Это делает следующее:

  • метод кодирования не возвращает null! Он бросает TranscoderException, поэтому он помещается в expected
  • переопределить метод close с исключением метания
  • позвонить закодировать
Смежные вопросы