是否可以使用@Spy表示法声明但不能在Mockito中实例化一个间谍对象?

时间:2015-12-03 20:10:43

标签: java mocking mockito spy partial-mocks

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

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

我能看到能够做到这一点的唯一方法是混合我的语法并使用传统的间谍(对象到模拟)表示法。那就是:

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

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

1 个答案:

答案 0 :(得分:0)

请注意@Spy实际上不是文档注释:它是MockitoJUnitRunner(等)的一条指令,根据其记录的使用模式自动初始化间谍。虽然注释是有用且信息丰富的,但我认为这可能会导致更多混淆,因为它的名称而不是其语义使用注释。

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

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

虽然你喜欢在类初始化器或构造函数上使用@Before方法,但这是一种明确记录的初始化方法,并且不太可能导致测试污染或初始化顺序问题。