为了账号安全,请及时绑定邮箱和手机立即绑定

对作为一类实例的字段使用 Mock

对作为一类实例的字段使用 Mock

Helenr 2022-05-21 20:54:01
我有一堂课:public class Sender {    private final SomeClass firstField;    private final SomeClass secondField;    private Sender(SomeClass firtsField, SomeClass secondField){        this.firstField = firstField;        this.secondField = secondField;    }}@RunWith(MockitoJUnitRunner.class)public class SenderTest{    @Mock    private firstField;    @Mock    private secondField;}一切看起来都是等级的,但看起来它在两个领域或类似的东西中注入了相同的对象。当我尝试对一个字段使用 when(..).thenReturn() 时,它会设置另外两个数据和虎钳诗句;最奇怪的是它在调试模式下工作正常。你能说什么?
查看完整描述

2 回答

?
守着一只汪

TA贡献1872条经验 获得超4个赞

Mockito 在构造函数注入两个或多个相同类型的字段时存在一些问题。但是,如果您使用 setter 注入,它会完美运行。


所以你可以像这样重构“Sender”类:


    public class Sender {

        private SomeClass firstField;

        private SomeClass secondField;

        public void setFirstField(SomeClass firstField) {

            this.firstField = firstField;

        }

        public void setSecondField(SomeClass secondField) {

            this.secondField= secondField;

        }

    }

请记住,如果类同时具有构造函数和设置器,Mockito 将选择构造器进行注入并完全忽略设置器。


编辑:如果你出于某种原因肯定需要使用构造函数,你总是可以手动模拟字段而不是使用 Mockito 注释。因此,在您的情况下,Sender 将保持不变,而 SenderTest 将是这样的:


public class SenderTest {


    private SomeClass firstField;

    private SomeClass secondField;


    private Sender sender;


    @Before

    public void setUp() {

        firstField = Mockito.mock(SomeClass.class);

        secondField = Mockito.mock(SomeClass.class);


        sender = new Sender(firstField, secondField);

    }


    @Test

    public void smokeTest() {


    }

}


查看完整回答
反对 回复 2022-05-21
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

这取决于它SomeClass本身是什么。它是一个数据(POJO)对象,值得在测试中创建它们(即填充随机生成的值)。

如果是服务。它可能是架构问题的标志。为什么你需要相同服务的两个副本?可能进行一些重构是有意义的。


查看完整回答
反对 回复 2022-05-21
  • 2 回答
  • 0 关注
  • 109 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号