Mockito模拟从数据库服务获取方法

时间:2013-05-09 22:18:04

标签: spring unit-testing mocking mockito

我试图在模拟服务添加添加元素后模拟getBy()方法。

这就是我所拥有的:

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()?

以下是两个班级:

存储库:

@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);
    }

}

1 个答案:

答案 0 :(得分:2)

您的代码似乎永远不会调用:

feedRepository.findAllByCategory("Category Test");

但你为它添加了一个验证器。 Mockito验证可确保在测试中调用该方法一次。如果没有发生这种情况,则会出现例外情况。

您的测试电话:

feedServiceTested.createFeedItem(...)

只在repo上调用以下方法:

add(feedItem)

这是您的第一次验证。所以目前您的代码似乎没有使用findAllByCategory,因此验证会抛出此异常。

或者FeedItem中是否有对回购的调用?那么请提供这门课程的代码。