我必须处理没有测试的遗留应用程序。所以在我开始重构之前,我想确保一切正常。
现在想象以下情况:
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
...
基本上我只是想了解间谍在这里失败的原因。
答案 0 :(得分:2)
根据its Javadoc,Mockito.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 );