Java 对一个类的实例字段使用Mock

Java 对一个类的实例字段使用Mock,java,mocking,mockito,Java,Mocking,Mockito,我有一门课: public class Sender { private final SomeClass firstField; private final SomeClass secondField; private Sender(SomeClass firtsField, SomeClass secondField){ this.firstField = firstField; this.secondField = secondFiel

我有一门课:

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()时,它会对另两个字段设置数据,并用vise-verse;最奇怪的是,它在调试模式下工作良好。你能说什么

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

    }
}
请记住,如果类同时具有构造函数和setter,Mockito将选择用于注入的构造函数并完全忽略setter

编辑:如果出于某种原因确实需要使用构造函数,则始终可以手动模拟字段,而不是使用Mockito注释。 因此,在您的情况下,发送方将保持不变,发送方测试将如下所示:

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

    }
}

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


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

您如何运行测试?可能重新编译每个类SenderTest中的字段缺少其类型。此外,在您的测试中发送方是如何初始化的?@Leonard我认为这不是很好的McVe如果字段是
final
,我能做什么?