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 は、メソッドがテストで 1 回呼び出されることを保証します。これが起こらなかった場合、例外で不平を言います。

テスト呼び出し:

feedServiceTested.createFeedItem(...)

レポで次のメソッドのみを呼び出します。

add(feedItem)

これはあなたの最初の確認です。したがって、現時点では、コードが findAllByCategory を使用していないようで、検証によってこの例外がスローされます。

それとも、FeedItem でリポジトリへの呼び出しがありますか? 次に、このクラスのコードも提供してください。

于 2013-05-09T22:36:55.247 に答える