Java 莫基托说:";被通缉但未被援引”;但调试测试跳入了这种方法

Java 莫基托说:";被通缉但未被援引”;但调试测试跳入了这种方法,java,unit-testing,junit,mockito,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(fi

我必须处理一个没有测试的遗留应用程序。因此,在开始重构之前,我想确保一切都按原样进行

现在想象一下以下情况:

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()
,我得到了一个失败的测试和“想要但没有调用…”。 我直接跳入调试模式并进行了检查。这个方法叫做

这可能是什么原因?我是不是误用了这里的间谍

Edit:我想说的是,我知道这不是您通常测试的,特别是因为
someOtherMethod(…)
在这里有一个非无效的返回值。但是假设返回值是
void

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

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

将myTestObject.doSomething(…)更改为spy.doSomething(…),它应该可以工作

备选方案(实现同一目标的不同方式): 考虑在MyTestObjor对象上使用<代码> @间谍>代码>注释。 确保添加
MockitoAnnotations.initMocks(此)到您的初始化方法(在junit测试中)。

@Before
@Mock
注释也很有用。

我让一个对象创建另一个对象,另一个对象进行调用。所以我需要让内部对象使用spied引用。我使用反射并使用白盒更新引用

TestAddressFragment fragment = spy(new TestAddressFragment());
AddressPresenter presenter = fragment.getPresenter();
Whitebox.setInternalState(presenter, "view", fragment );
现在,我的片段可以检查其方法是否被调用

verify( fragment ).showAddress(any(), anyBoolean());

这是深层拷贝吗?@Sorona没有在文档中指定,但快速检查来源表明没有。只有浅层拷贝。