2013-05-09 48 views
0

我試圖通過模擬服務添加元素添加元素後嘲笑getBy()方法。Mockito嘲笑從數據庫服務獲取方法

這是我有:

FeedItem feedItem = feedServiceTested.createFeedItem("Text Test", "Category Test", "Author Test"); 
     Mockito.verify(feedRepository).add(feedItem); 

     Mockito.verify(feedRepository).findAllByCategory("Category Test"); 

不過,我得到以下錯誤:

Wanted but not invoked: 
feedRepository.findAllByCategory(
    "Category Test" 
); 
-> at ie.cit.adf.services.FeedServiceImplTest.testSearchFeedItemsByCategory(FeedServiceImplTest.java:55) 

However, there were other interactions with this mock: 
-> at ie.cit.adf.services.FeedServiceImpl.createFeedItem(FeedServiceImpl.java:44) 

    at ie.cit.adf.services.FeedServiceImplTest.testSearchFeedItemsByCategory(FeedServiceImplTest.java:55) 

任何想法如何嘲笑這個findAllByCategory()?

這裏有2類:

庫:

@Secured("ROLE_USER") 
public class JdbcFeedRepository implements FeedRepository { 

    private JdbcTemplate jdbcTemplate; 
    private FeedItemsMapper feedItemsMapper = new FeedItemsMapper(); 

    public JdbcFeedRepository(DataSource dataSource) { 
     jdbcTemplate = new JdbcTemplate(dataSource); 
    } 

    @Override 
    public FeedItem findById(String feedItemId) { 
     return jdbcTemplate.queryForObject(
      "SELECT ID, TEXT, CATEGORY, AUTHOR FROM FEEDITEMS WHERE ID=?", 
      feedItemsMapper, 
      feedItemId 
     ); 
    } 

    @Override 
    public List<FeedItem> findAll() { 
     return jdbcTemplate.query(
      "SELECT ID, TEXT, CATEGORY, AUTHOR FROM FEEDITEMS", 
      feedItemsMapper 
     ); 
    } 

    @Override 
    public List<FeedItem> findAllByCategory(String category) { 
     return jdbcTemplate.query(
       "SELECT ID, TEXT, CATEGORY, AUTHOR FROM FEEDITEMS WHERE CATEGORY=?", 
       feedItemsMapper, 
       category 
      ); 
    } 

    @Override 
    public List<FeedItem> findAllByAuthor(String author) { 
     return jdbcTemplate.query(
      "SELECT ID, TEXT, CATEGORY, AUTHOR FROM FEEDITEMS WHERE AUTHOR=?", 
      feedItemsMapper, 
      author 
     ); 
    } 

    @Override 
    public void add(FeedItem feedItem) { 
     jdbcTemplate.update(
      "INSERT INTO FEEDITEMS VALUES(?,?,?,?)", 
      feedItem.getId(), 
      feedItem.getText(), 
      feedItem.getCategory(), 
      feedItem.getAuthor() 
     ); 
    } 

    @Override 
    public void delete(String feedItemId) { 
     jdbcTemplate.update("DELETE FROM FEEDITEMS WHERE ID=?", feedItemId); 
    } 

    /** 
    * Returns the name of the currently logged in Author. 
    * 
    * @return String 
    */ 
    private String getCurrentUser() { 
     return SecurityContextHolder.getContext().getAuthentication().getName(); 
    } 

} 

class FeedItemsMapper implements RowMapper<FeedItem> { 
    @Override 
    public FeedItem mapRow(ResultSet rs, int rowNum) throws SQLException { 
     FeedItem feedItem = new FeedItem(); 
     feedItem.setId(rs.getString("ID")); 
     feedItem.setText(rs.getString("TEXT")); 
     feedItem.setCategory(rs.getString("CATEGORY")); 
     feedItem.setAuthor(rs.getString("AUTHOR")); 
     return feedItem; 
    } 
} 

服務:

@Transactional 
public class FeedServiceImpl implements FeedService { 

    private FeedRepository repo; 

    public FeedServiceImpl(FeedRepository repo) { 
     this.repo = repo; 
    } 

    @Override 
    public FeedItem get(String feedItemId) { 
     return repo.findById(feedItemId); 
    } 

    @Override 
    public List<FeedItem> getAllFeedItems() { 
     return repo.findAll(); 
    } 

    @Override 
    public List<FeedItem> getAllFeedItemsByCategory(String category) { 
     return repo.findAllByCategory(category); 
    } 

    @Override 
    public List<FeedItem> getAuthorFeedItems(String author) { 
     return repo.findAllByAuthor(author); 
    } 

    @Override 
    public FeedItem createFeedItem(String text, String category, String author) { 
     FeedItem feedItem = new FeedItem(); 
     feedItem.setText(text); 
     feedItem.setCategory(category); 
     feedItem.setAuthor(author); 

     repo.add(feedItem); 

     return feedItem; 
    } 

    @Override 
    public void delete(String feedItemId) { 
     repo.delete(feedItemId); 
    } 

} 
+0

你的測試看起來基本上合理。你可以顯示正在測試的方法 - feedServiceTested.createFeedItem? – 2013-05-09 22:23:01

+0

檢查原帖,已更新。 – 2013-05-09 22:27:12

+0

仍然不包含createFeedItem方法,它是在測試代碼中執行的方法。 – 2013-05-09 22:30:08

回答

2

看來你的代碼永遠不會調用:

feedRepository.findAllByCategory("Category Test"); 

但是你加了驗證它。 Mockito驗證確保該方法在您的測試中被調用一次。當這種情況沒有發生時,它抱怨有例外。

您的測試呼叫:

feedServiceTested.createFeedItem(...) 

其中僅呼籲回購以下方法:

add(feedItem) 

這是您第一次驗證。所以目前看來你的代碼並沒有使用findAllByCategory,驗證也拋出了這個異常。

或者是否有FeedItem中的回調?那麼請提供該課程的代碼。

+0

我已經更新了2類的帖子 – 2013-05-09 22:48:28

+0

我猜你的類FeedItem只是一個愚蠢的java對象,沒有任何邏輯或調用任何其他類?只是getter和setter? – mszalbach 2013-05-09 22:59:29

+0

這是正確的,唯一的邏輯是使用以下方法在對象中設置一個id:UUID.randomUUID()。toString(); – 2013-05-10 07:33:38