猿问

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

我有一堂课:


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() 时,它会设置另外两个数据和虎钳诗句;最奇怪的是它在调试模式下工作正常。你能说什么?


Helenr
浏览 110回答 2
2回答

守着一只汪

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() {    }}

幕布斯7119047

这取决于它SomeClass本身是什么。它是一个数据(POJO)对象,值得在测试中创建它们(即填充随机生成的值)。如果是服务。它可能是架构问题的标志。为什么你需要相同服务的两个副本?可能进行一些重构是有意义的。
随时随地看视频慕课网APP

相关分类

Java
我要回答