【问题标题】:Is it possible to Declare but not Instatiate a Spied Object in Mockito using @Spy Notation?是否可以使用@Spy 表示法在 Mockito 中声明但不能实例化间谍对象?
【发布时间】:2015-12-03 20:10:42
【问题描述】:

我正在为遗留代码编写一些 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);
    }
}

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

【问题讨论】:

    标签: java mocking mockito spy partial-mocks


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 不幸的是,我想引用对象类型而不实例化它,直到稍后才能测试多个输入。这可以访问任何其他测试用例中的对象。在大量玩耍之后,我发现不可能用注释来做到这一点。它需要对对象的真实引用,然后使用 spy(someClass) 引用。使用抽象类,这更加困难,但在 Mockito 1.10 中工作得很好
    猜你喜欢
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    相关资源
    最近更新 更多