Mockito说“通缉但未调用”,但调试测试跳转到该方法

时间:2016-09-09 20:02:29

标签: java unit-testing junit mockito

我必须处理没有测试的遗留应用程序。所以在我开始重构之前,我想确保一切正常。

现在想象以下情况:

public SomeObject doSomething(final OtherObject x, final String something) {
    if(x != null) {
        final String = someOtherMethod(x, something);
    }
}

protected String someOtherMethod(final OtherObject x, final String something) {
    ....
}

现在我想确保调用受保护的方法

所以我做了这个

@InjectMocks // Yes there is more going on here
private MyTestObject myTestObject;

private MyTestObject spy;

private static final OtherObject VALID_OTHER_OBJECT = new OtherObject();

@Before
public void setup() {
    this.spy = Mockito.spy(myTestObject);
}

@Test
public void ifOtherObjectIsNotNullExpectSubMethodToBeCalled() {
    myTestObject.doSomething(VALID_OTHER_OBJECT, null);
    verify(spy).someOtherMethod(VALID_OTHER_OBJECT, null);
}

someOtherMethod()我得到了一个失败的测试和“通缉但未被调用...”。 我跳到调试模式并检查。这个方法叫做!

这可能是什么原因?我在这里滥用间谍吗?

编辑:我想延伸我知道这不是您通常要测试的内容,尤其是因为此处someOtherMethod(...)具有非空返回值。但是假设返回值是void ...

基本上我只是想了解间谍在这里失败的原因。

2 个答案:

答案 0 :(得分:2)

根据its JavadocMockito.spy(object)创建传入对象的副本。调用传入对象的原始方法然后不在间谍上注册,因为间谍实例不是同一个对象。

myTestObject.doSomething(...)更改为spy.doSomething(...),它应该有效。

替代方案(实现同样的事情的不同方式): 考虑在myTestObject上使用@Spy注释。 请务必将MockitoAnnotations.initMocks(this);添加到初始化方法(在junit测试中)。 @Before@Mock注释也很有用。

答案 1 :(得分:0)

我有一个对象创建另一个对象,另一个对象进行调用。所以我需要让内部对象改为使用间接引用。我使用了反射并使用Whitebox更新了引用。

TYPE V_EMPRECORD
IS
RECORD
(
 ID NUMBER,
 NAME VARCHAR2(100),
 JOIN_DATE VARCHAR2(50)
);
EMP V_EMPRECORD; --DECLARE THE VARIABLE OF TYPE V_EMPRECORD
----- WRONG WAY
 SELECT.... INTO V_EMPRECORD FROM ...
----- RIGHT WAY
 SELECT .... INTO EMP FROM.....

现在我的片段可以检查它的方法是否被调用。

TestAddressFragment fragment = spy(new TestAddressFragment());
AddressPresenter presenter = fragment.getPresenter();
Whitebox.setInternalState(presenter, "view", fragment );