gpt4 book ai didi

java - 如何使用 Dagger 模块和 Robolectric 测试 Activity onResume() 上的模拟交互?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:14:21 26 4
gpt4 key购买 nike

我正在使用 Dagger 进行依赖项注入(inject),它在我的应用程序中运行良好,但我无法对其进行测试。我遵循这种模式来创建模块依赖关系图:https://github.com/pyricau/shipfaster/blob/master/src/main/java/com/squareup/shipfaster/common/ShipFasterApplication.java

现在,在我的 MainActivity 测试类中,我希望能够在调用 Activity onResume() 方法时验证与模拟的交互。

这是类(class):

@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 生命周期调用。

关于如何设法测试它的任何想法?

最佳答案

使用真实对象是因为我猜您在Application 类中初始化了ObjectGraph。当您在测试期间调用 ((Application) getApplication()).inject(this) 时,您使用的是与刚刚运行应用程序时相同的 ObjectGraph

在此测试中,您将使用 MyObject 的模拟实例创建全新的 ObjectGraph。此模拟仅在 MainActivityTest 中注入(inject),因为当在 MainActivity 中调用 inject() 时,它使用 ObjectGraph应用程序

你可以做的是制作 TestApplication 类(它必须与你的 Application 类有相同的包,但需要在测试目录中)扩展你的应用程序并在那里添加您的 TestModule 以使用模拟覆盖真实实例。例如这样:

我的应用程序.java

package com.example.myapp;

public class MyApplication extends Application {

ObjectGraph graph;
private Account currentAccount;

@Override
public void onCreate() {
super.onCreate();
graph = ObjectGraph.create(getModules().toArray());
init();
}

void init() {
// initialization stuff should not be called in tests
}

List<Object> getModules() {
List<Object> modules = new ArrayList<>();
modules.add(new ActivityModule(this));
return modules;
}

public void inject(Object object) {
graph.inject(object);
}
}

TestMyApplication.java

package com.example.myapp;

public class TestMyApplication extends MyApplication {

@Override
void init() {

}

@Override
List<Object> getModules() {
modules = super.getModules();
modules.add(new TestModule());
return modules;
}
}

关于java - 如何使用 Dagger 模块和 Robolectric 测试 Activity onResume() 上的模拟交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27485669/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com