【发布时间】:2014-12-15 13:55:42
【问题描述】:
我正在使用 Dagger 进行依赖注入,它在我的应用程序中运行良好,但我无法对其进行测试。我遵循这个模式来创建模块依赖图:https://github.com/pyricau/shipfaster/blob/master/src/main/java/com/squareup/shipfaster/common/ShipFasterApplication.java
现在,在我的 MainActivity 测试类中,我希望能够在调用 Activity onResume() 方法时验证与模拟的交互。
这是课程:
@Config(emulateSdk = 18)
@RunWith(RobolectricDaggerTestRunner.class)
public class MainActivityTest extends TestCase {
@Inject MainActivity sut;
public @Mock MyObject mockMyObject;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
ObjectGraph.create(new TestModule()).inject(this);
}
@Test
public void testThatMyActivityDelegatesDoSomethingToMyObject(){
//init
ActivityController<MainActivity> activityController = ActivityController.of(sut);
//run
activityController.create().start().resume();
//verify
Mockito.verify(mockMyObject).doSomething();
}
@Module(
includes = {ActivityModule.class},
injects = MainActivityTest.class,
overrides = true,
library = true
)
class TestModule {
@Provides
MyObject provideMyObject() {
return mockMyObject;
}
}
}
据我所知,调用了 onCreate() 方法,但使用了 myObject 的真实实例,而不是模拟的实例。测试失败并显示“需要但未调用 - 实际上,与此模拟的交互为零。”错误。
这可能是因为我尝试使用 Robolectric 创建的 MainActivity 与我的 TestModule 没有关联,因为它是在应用程序级别创建的,但我设法通过显式调用 MainActivity 上的方法并放置myObject.doSomething() 在那里,但我需要的是测试 Android 生命周期调用。
知道如何测试这个吗?
【问题讨论】:
-
您的
MainActivity sut实例来自哪里?是否有提供此类的另一个模块?你什么时候将MyObject实例注入sut? -
在上面的代码示例中,
MainActivity是使用@Inject注入的,它不是由任何模块提供的,dagger 只会使用默认构造函数。我还尝试通过MainActivity sut = new MainActivity()在我的setup()方法中创建它,它没有任何区别。在 MainActivity 中,myObjected 由 Dagger 注入:public class MainActivity extends BaseActivity { @Inject MyObject myObject; ... -
好的,我假设您的
@Inject构造函数上有@Inject注释。您具体在哪里将MyObject注入MainActivity?每当 Dagger 使用默认构造函数实例化对象时,它不会注入其字段。 -
@Inject不在构造函数中,而是在字段声明中,不,使用 Dagger,您无需专门将对象注入 Activity,Dagger 会自动为您完成。您唯一需要做的就是创建依赖关系图。我在 MainActivity((Application) getApplication()).inject(this);的onCreated()方法中执行此操作。提醒一下,我的代码功能齐全,编译和工作都很好,只有单元测试是个问题。 -
你是对的,我错了。
标签: java android unit-testing robolectric dagger