对作为单个类实例的字段使用 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() 对于一个字段,它设置数据两个另一个和虎钳诗句;最奇怪的是它在调试模式下工作正常。你能说什么?

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

请记住,如果类同时具有构造函数和setter,则Mockito将选择用于注入的构造函数,并完全忽略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() {
    }
}

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

如果是服务。它可以是体系结构问题的标志。为什么需要同一服务的两个副本?做一些重构可能是有意义的。

相关内容

  • 没有找到相关文章

最新更新