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
,我能做什么?