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没有在文档中指定,但快速检查来源表明没有。只有浅层拷贝。