JUnit Test中的Roboguice.setBaseApplicationInjector中的NullPointerException

时间:2013-07-04 17:28:57

标签: android unit-testing junit mockito roboguice

我遇到了与Roboguice和JUNIT有关的问题。实际上我正在进行一项非常小的测试以使其运行,代码:

import junit.framework.Assert;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import roboguice.RoboGuice;
import android.app.Application;
import android.content.Context;

public class FansworldClientTest {
    TaskClient client;
    @Mock
    Application application;
    @Mock
    Context context;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        client = RoboGuice.getInjector(application).getInstance(TaskClient.class);
    }
    @Test
    public void getTimestampTest() {
        Assert.assertNotNull(application);
        Assert.assertNotNull(context);
        Assert.assertNotNull(client);
    }
    @After
    public void teardown() {
        RoboGuice.util.reset();
    }
}

mvn test命令抛出了这个:

  

java.lang.NullPointerException:null       在roboguice.RoboGuice.setBaseApplicationInjector(RoboGuice.java:116)       在roboguice.RoboGuice.getBaseApplicationInjector(RoboGuice.java:59)       在com.app.api.client.TaskClientTest.setup(TaskClientTest.java:38)

我使用的是Roboguice 2.0,Junit 4.8.2和Mockito 1.9.5。我也在尝试这样做:

MockitoAnnotations.initMocks(this);
RoboGuice.setBaseApplicationInjector(application, RoboGuice.DEFAULT_STAGE);
RoboGuice.getInjector(application).getInstance(FansworldClient.class);

同样的结果。这取自官方Roboguice项目的Astroboy2Test.class。

谢谢!

1 个答案:

答案 0 :(得分:1)

你不能将模拟与Roboguice结合使用,让Robolectric提供你需要的上下文更好。

有一个很好的教程如何从Moritz Post设置所有这些:

http://eclipsesource.com/blogs/2012/09/25/advanced-android-testing-with-roboguice-and-robolectric/

基于这项工作,我前一篇文章发布了一篇文章,如何在功能测试中使用模拟:

http://www.thomaskeller.biz/blog/2012/10/18/runtime-replace-implementations-with-roboguice-in-functional-tests/