0

在通过模拟服务添加添加元素后,我试图模拟 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() 吗?

这是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);
    }

}
4

1 回答 1

2

看来您的代码从不调用:

feedRepository.findAllByCategory("Category Test");

但是您为它添加了一个验证器。Mockito verify 确保该方法在您的测试中被调用一次。当这没有发生时,它会抱怨异常。

您的测试调用:

feedServiceTested.createFeedItem(...)

仅在 repo 上调用以下方法:

add(feedItem)

这是您的第一个验证。因此,目前您的代码似乎没有使用 findAllByCategory ,因此验证也会引发此异常。

或者 FeedItem 中是否有对 repo 的调用?那么请也提供这个类的代码。

于 2013-05-09T22:36:55.247 回答