微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在测试 Card 和 CardCollection 类时使用 GoogleMock 避免依赖

如何解决在测试 Card 和 CardCollection 类时使用 GoogleMock 避免依赖

我正在学习模拟并且对这些概念相当陌生。为了学习,我正在实现一个 Card 类和一个依赖于 CardCollectionCard 类。因此,我创建了一个 MockCard 来测试 CardCollection

这是Card.h

    class ICard {
    protected:
        int rank_;
        std::string suit_;
    public:

        ICard(int rank,std::string suit) : rank_(rank),suit_(std::move(suit)) {};

        [[nodiscard]] virtual int getRank() const = 0;

        [[nodiscard]] virtual std::string getSuit() const  = 0;

        friend std::ostream &operator<<(std::ostream &os,const ICard &c);

        bool operator>(const ICard &other) const;

        bool operator<(const ICard &other) const;

        bool operator<=(const ICard &other) const;

        bool operator>=(const ICard &other) const;

        bool operator==(const ICard &other) const;

        bool operator!=(const ICard &other) const;
    };

    class Card : public ICard {
    public:

        Card(int r,std::string s);

        [[nodiscard]] int getRank() const override;

        [[nodiscard]] std::string getSuit() const override;

    };

MockCard.h

#include "gmock/gmock.h"
class MockCard : public ICard {
public:
    MockCard(int rank,std::string suit) : ICard(rank,std::move(suit)){};
    MOCK_METHOD(int,getRank,(),(const,override));
    MOCK_METHOD(std::string,getSuit,override));
};

还有CardCollection.h

    #include "Card.h"
    class CardCollection {

    protected:
        vector<ICard *> cards_;
    public:

        CardCollection() = default;

        ~CardCollection() = default;

        explicit CardCollection(vector<ICard*> cards);

        ICard* pop();

    ...

这是我的测试:

#include "gmock/gmock.h"
TEST(CardCollectionTests,TestPop) {
    MockCard card1(6,"C");
    std::vector<ICard*> cards({&card1});
    CardCollection cc(cards);

    // pop the card off the collection,cast to MockCard
    auto* new_card = (MockCard*) cc.pop();

    ASSERT_EQ(6,new_card->getRank());
}

我能想到的最好的测试是验证卡片是 6 个俱乐部。但是我们不能直接使用 Card 类,因为这会在单元测试中引入不需要的依赖项。因此,我决定将从 ICard* 返回的 CardCollection::pop 转换为 MockCard* 类型,以便我们可以使用 getRank() 方法并测试返回的值是否为 {{1} }.然而,这是一个 6 而不是 MockCard 所以 Card 实际上返回一个 getRank() 并且测试失败。

如何将 0 返回的值设置为 MockCard::getRank()?更一般地说,在我测试此行为的方法中,您是否可以看到任何明显的缺陷?如果是,您将实施什么替代方案?

解决方法

获得指向 new_card 的指针后,您可以使用

ON_CALL(*new_card,getRank()).WillByDefault(Return(6));

使您的模拟方法返回 6

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。