1

我正在为遗留代码编写一些 JUnit 测试,并且我非常喜欢使用注释。我想知道是否可以为间谍对象创建声明并稍后实例化它。我问的原因是因为我有一个带有非空构造函数的类。在设置测试用例之前,此构造函数的值是未知的。下面的代码显示了我想做的事情:

@RunWith(MockitoJUnitRunner.class)
public class ObjectUndertestTest {

    @Spy private SomeClassToSpy someClassToSpy; 
    private Integer parameterOne;
    private Integer parameterTwo;

    @Before
    public void setupTest() {
        parameterOne = 1;
        parameterTwo = 2;
        someClassToSpy = new SomeClassToSpy(parameterOne, parameterTwo);
    }
}

我认为能够做到这一点的唯一方法是混合我的语法并使用传统的 spy(object to mock) 表示法。那是:

@RunWith(MockitoJUnitRunner.class)
public class ObjectUndertestTest {

    private SomeClassToSpy someClassToSpy; 
    private Integer parameterOne;
    private Integer parameterTwo;

    @Before
    public void setupTest() {
        parameterOne = 1;
        parameterTwo = 2;
        someClassToSpy = new SomeClassToSpy(parameterOne, parameterTwo);
        SomeClassToSpy spySomeClassToSpy spy(someClassToSpy);
    }
}

或类似的东西。对此有什么想法吗?

4

1 回答 1

1

请注意,这@Spy并不是真正的文档注释:它是 MockitoJUnitRunner (et al)根据其记录的使用模式自动为您初始化间谍的指令。尽管注释很有用且信息丰富,但我认为将注释用作其名称而不是其语义可能会引起更多混乱。

也就是说,如果只是用你选择的构造函数参数构造一个实例,你可以直接显式地调用构造函数,并使用 Mockito 的初始化将它包装在一个间谍中(如在@Spy 文档中):

@Spy private SomeClassToSpy someClassToSpy = new SomeClassToSpy(1, 2);

尽管您更喜欢 @Before 方法而不是类初始化器或构造器是正确的,但这是一种明确记录的初始化方法,不太可能导致测试污染或初始化顺序问题。

于 2015-12-03T21:07:28.423 回答