2017-11-16 12 views
1

渡されたデータに基づいてワークブックを作成するクラスを作成しました。私は今私のメソッドをテストするためのmockitoテストを書いています。私はpowermockを使用することはできません。以下はコードスニペットです。mockitoを使用してapache poiをテストする必要があります

public class TalkDetailsToExcel extends AbstractXlsView { 
    private static final ResourceBundle RESOURCE_BUNDLE = MessageResource.getResourceBundle(); 

    /** 
    * Builds the {@link Workbook} containing {@link Talk} details and adds to the {@link Sheet}. 
    * 
    * @param model    the {@link Map} containing the {@link List} of {@link Talk}. 
    * @param workbook   the Excel {@link Workbook} to which {@link Talk} needs to be added. 
    * @param httpServletRequest the {@link HttpServletRequest} 
    * @param httpServletResponse the {@link HttpServletResponse} 
    * @throws Exception   when adding talk details to workbook. 
    */ 
    @Override 
    protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest httpServletRequest, 
             HttpServletResponse httpServletResponse) throws Exception { 
     final String talkListName = "talkList"; 
     final String fileName = "Talk Details.xls"; 

     httpServletResponse.setHeader("Content-Disposition", "attachment; filename=" + fileName); 
     List<Talk> talkList = (List<Talk>) model.get(talkListName); 
     Sheet sheet = createAndReturnSheetFromWorkbook(workbook); 
     addTalkDetailsToSheet(talkList, sheet); 
    } 

    /** 
    * Creates data cells to the {@link Sheet}. 
    * 
    * @param talkList the {@link List} of {@link Talk} objects. 
    * @param sheet the {@link Sheet} to which {@link Talk} details need to add. 
    */ 
    @VisibleForTesting 
    void addTalkDetailsToSheet(List<Talk> talkList, Sheet sheet) { 
     Verifier.verifyNotNull(talkList, RESOURCE_BUNDLE.getString(MessageResource.SHEET_NULL)); 
     Verifier.verifyNotEmpty(talkList, RESOURCE_BUNDLE.getString(MessageResource.WORKBOOK_NULL)); 
     Verifier.verifyNotNull(sheet, RESOURCE_BUNDLE.getString(MessageResource.WORKBOOK_NULL)); 

     int rowCount = 1; 
     for (Talk talk : talkList) { 
      Row talkRow = sheet.createRow(rowCount++); 
      talkRow.createCell(0).setCellValue(talk.getConference().getName()); 
      talkRow.createCell(1).setCellValue(talk.getTitle()); 
      talkRow.createCell(2).setCellValue(talk.getSpeaker()); 
      talkRow.createCell(3).setCellValue(talk.getCernerId()); 
      talkRow.createCell(4).setCellValue(String.valueOf(talk.getDifficultyLevel())); 
      talkRow.createCell(5).setCellValue(talk.getDateTimeStr()); 
     } 
    } 

    /** 
    * Creates and returns an empty {@link Sheet} containing header {@link Row}. 
    * 
    * @param workbook  the {@link Workbook} for which {@link Sheet} needs to be created. 
    * @return {@link Sheet} containing the header {@link Row}. 
    */ 
    public Sheet createAndReturnSheetFromWorkbook(Workbook workbook) { 
     Verifier.verifyNotNull(workbook, RESOURCE_BUNDLE.getString(MessageResource.WORKBOOK_NULL)); 

     final String sheetName = "Conference Details"; 
     final String conferenceName = "Conference"; 
     final String talkTitle = "Talk"; 
     final String speakerName = "Speaker"; 
     final String cernerIdOfSpeaker = "Cerner Id"; 
     final String difficultyLevel = "Difficulty"; 
     final String dateTimeOfTalk = "Date Time"; 

     Sheet sheet = workbook.createSheet(sheetName); 
     Row header = sheet.createRow(0); 
     header.createCell(0).setCellValue(conferenceName); 
     header.createCell(1).setCellValue(talkTitle); 
     header.createCell(2).setCellValue(speakerName); 
     header.createCell(3).setCellValue(cernerIdOfSpeaker); 
     header.createCell(4).setCellValue(difficultyLevel); 
     header.createCell(5).setCellValue(dateTimeOfTalk); 
     return sheet; 
    } 
} 

後、私はcreateRowを使用して行を模擬することはできませんよ、私はJUnitのを書くために、これまで書いてきたコードスニペットです。問題はRowは常にnullで、テストではnullポインタ例外がスローされます。どんな提案も高く評価されます。あなたは、私はこのラインでNPEを再現付属のコードを使用して

/** 
    * Tests {@link TalkDetailsToExcel#createAndReturnSheetFromWorkbook(Workbook)} returns a {@link 
    * Sheet} 
    */ 
    @Test 
    public void testCreateAndReturnSheetFromWorkbookReturnsSheet() { 
    Workbook mockWorkbook = mock(Workbook.class); 
    Sheet mockSheet = mock(Sheet.class); 
    Row mockRow = mock(Row.class); 
    doReturn(mockSheet).when(mockWorkbook).createSheet(); 
    doReturn(mockRow).when(mockSheet.createRow(anyInt())); 

    Sheet sheet = mockTalkDetailsToExcel.createAndReturnSheetFromWorkbook(mockWorkbook); 
    } 
+0

あなたのカッコが間違った場所にあるように見えます。 'doReturn(mockRow).when(mockSheet).createRow(anyInt());'を書くと、まだエラーが出ますか? –

答えて

3

...

talkRow.createCell(0).setCellValue(...) 

...嘲笑が指定されましたが、このモックは、呼び出しに Cellを返すように指示されていなかったので、 createCellです。次のようにこれを嘲笑することができ

when(mockSheet.createRow(anyInt())).thenReturn(mockRow); 
when(mockRow.createCell(anyInt())).thenReturn(mockCell); 

ので、テストがに書き換えることができます

Workbook mockWorkbook = mock(Workbook.class); 
Sheet mockSheet = mock(Sheet.class); 
Row mockRow = mock(Row.class); 
Cell mockCell = mock(Cell.class); 
when(mockWorkbook.createSheet("Conference Details")).thenReturn(mockSheet); 
when(mockSheet.createRow(0)).thenReturn(mockRow); 
when(mockSheet.createRow(anyInt())).thenReturn(mockRow); 
when(mockRow.createCell(anyInt())).thenReturn(mockCell); 

Sheet sheet = mockTalkDetailsToExcel.createAndReturnSheetFromWorkbook(mockWorkbook); 

これはNPEに対応しています。

+0

これはコンパイルされますか?そしてそれはNullPointerExceptionをどのように扱うでしょうか?元のスタブを 'doReturn'と' when'で 'when'と' thenReturn'を使って同等のコードに置き換えるだけです。あなたは何を改善したのか分かりません。 –

+0

更新されました.MockRowが指定されていても、この模造は 'createCell'の呼び出しでセルを返すように指示されていなかったので、' talkRow.createCell(0).setCellValue(...) 'という行でNPEが発生しました。 – glytching

+0

私は参照してください。はい、あなたのアップデートは理にかなっており、これはおそらく正しいと思います。あなたのコメントから解答に説明を移すことができれば、本当に良いでしょう。説明自体は、世界のすべてのコードよりもはるかに価値があるので、本当に答えの一部でなければなりません。 –

関連する問題