gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:20:55 24 4
gpt4 key购买 nike

我有一个类(class):

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;
}

一切看起来都很有档次,但看起来它在两个字段中注入(inject)了相同的对象或类似的东西。当我尝试对一个字段使用 when(..).thenReturn() 时,它会设置另一个字段的数据,并反之亦然;最奇怪的是它在 Debug模式下工作正常。你能说什么?

最佳答案

Mockito 在构造函数注入(inject)两个或多个相同类型的字段时存在一些问题。但如果你使用 setter 注入(inject),它会完美地工作。

所以你可以像这样重构“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;
}
}

记住,如果类同时具有构造函数和setter,Mockito将选择构造函数进行注入(inject)并完全忽略setter。

编辑:如果由于某种原因您确实需要使用构造函数,您始终可以手动模拟字段,而不是使用 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() {

}
}

关于java - 对作为一个类实例的字段使用 Mock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54344601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com