断言Mockito模拟对象被设置为null

时间:2016-11-29 20:14:19

标签: android junit mockito

我正在使用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时失败?

1 个答案:

答案 0 :(得分:1)

@ kerseyd27,

从您的测试名称testThatObjectsAreNullifiedInOnDestroy看来,当演示者被销毁时,您正在寻找验证您的演示者是否已释放注入的mFooBar对象。

首先,直接回答你的问题:

  

与我实例化运行测试的对象相比,我的测试类中的模拟对象如何处理引用?

我会让这些答案(link 1link 2)说明一切,但要解释它与您的问题有何关系。模拟对象在Test类中实例化,并按值传递到FooPresenterFooPresenter.mFooBar是指向模拟对象的单独的引用(属于演示者)。在调用onDestroy方法之前,TestClass.mFooBarfooPresenter.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;
        }
    }
}

祝你好运快乐测试!