我正在使用Mockito进行JUnit测试,并坚持找出断言问题。我正在创建一个模拟对象,然后使用模拟对象创建一个presenter对象。
@Mock
Object mFooBar;
private FooPresenter mFooPresenter;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mFooPresenter = new FooPresenter(mFooBar);
}
在我的演示者的onDestroy()方法中,我将对象清空。
public FooPresenter(Object fooBar) {
mFooBar = fooBar;
}
@Override
public void onDestroy() {
mFooBar = null;
}
然后当我尝试在我的FooPresenterTest中为mFooBar设置assertNull时,它失败了,因为它不是null。
@Test
public void testThatObjectsAreNullifiedInOnDestroy() throws Exception {
fooPresenter.onDestroy();
assertNull(mFooBar);
}
这失败为
Expected :<null>
Actual :mFooBar
我的问题是,与我实例化运行测试的对象相比,我的测试类中的模拟对象的引用是如何处理的?为什么assertNull在应该设置为null时失败?
答案 0 :(得分:1)
@ kerseyd27,
从您的测试名称testThatObjectsAreNullifiedInOnDestroy
看来,当演示者被销毁时,您正在寻找验证您的演示者是否已释放注入的mFooBar
对象。
首先,直接回答你的问题:
与我实例化运行测试的对象相比,我的测试类中的模拟对象如何处理引用?
我会让这些答案(link 1,link 2)说明一切,但要解释它与您的问题有何关系。模拟对象在Test类中实例化,并按值传递到FooPresenter
。 FooPresenter.mFooBar
是指向模拟对象的单独的引用(属于演示者)。在调用onDestroy
方法之前,TestClass.mFooBar
和fooPresenter.mFooBar
引用相同的对象(模拟对象),但它们是对此对象的两个不同引用。
为什么assertNull应该设置为null时失败?
您声明Test.mFooBar
(属于Test类)为空。 Test.mFooBar
是在测试设置中创建的,但此变量永远不会设置为null。另一方面,fooPresenter.mFooBar
变量 显式设置为null。同样,虽然这些变量指向同一个对象,但引用本身并不相同。
如果您希望确保fooPresetner.mFooBar
为null,则可以将其设置为package-local或使用属性公开它。仅仅出于测试目的这样做通常是不受欢迎的。
如果您希望确保对构造函数中的mFooBar
对象执行某些操作,则可以编写如下测试:
public class TestClass {
interface FooBar {
void releaseSomething();
}
@Rule
public MockitoRule r = MockitoJUnit.rule();
@Mock
FooBar mFooBar;
@Test
public void testThatObjectsAreNullifiedInOnDestroy() {
new FooPresenter(mFooBar).onDestroy();
verify(mFooBar).releaseSomething();
}
class FooPresenter {
private FooBar mFooBar;
public FooPresenter(FooBar fooBar) {this.mFooBar = fooBar;}
@Override
void onDestroy() {
mFooBar.releaseSomething();
mFooBar = null;
}
}
}
祝你好运快乐测试!