当前位置: 首页 > 知识库问答 >
问题:

注入模拟对象时测试仪器过程崩溃

瞿宏儒
2023-03-14

我正在尝试运行UI测试。当我不嘲笑任何注入的依赖时,一切都运行得很好。当我将模块的@provides return切换到mocked对象时,我会得到以下消息:

已开始运行测试

测试仪器过程崩溃。

public class Nerfy extends Application {

private AppComponent appComponent;

public static Nerfy get(Context context) {
    return (Nerfy) context.getApplicationContext();
}

@Override
public void onCreate() {
    super.onCreate();
    System.out.println("on create");
    if (appComponent == null) {
        appComponent = buildProdAppComponent();
        appComponent.inject(this);
    }
}

public AppComponent buildProdAppComponent() {
    return DaggerAppComponent.builder()
            .appModule(new AppModule(this))
            .navigationModule(new NavigationModule())
            .refreshModule(new RefreshModule())
            .repoModule(new RepoModule())
            .sharedDataModule(new SharedDataModule())
            .threadsModule(new ThreadsModule())
            .build();
}

//@VisibleForTesting
public void setAppComponent(AppComponent appComponent) {
    System.out.println("on set");

    this.appComponent = appComponent;
    this.appComponent.inject(this);
}

public AppComponent getAppComponent() {
    return appComponent;
}

下面是一些测试代码:

@RunWith(AndroidJUnit4.class)
@LargeTest
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class CoreTest {

private UiDevice device;
public SharedData sharedData;
private AppComponent espressoAppComponent;

@Rule
public ActivityTestRule<Core> mActivityRule =
        new ActivityTestRule<Core>(Core.class) {
            @Override
            protected void beforeActivityLaunched() {
                System.out.println("beforeActivityLaunched");
                sharedData = mock(SharedData.class);
                System.out.println("shared data " + sharedData);

                espressoAppComponent = DaggerAppComponent.builder()
                        .appModule(new AppModule((Application) getTargetContext().getApplicationContext()))
                        .navigationModule(new NavigationModule())
                        .refreshModule(new RefreshModule())
                        .repoModule(new RepoModule())
                        .sharedDataModule(new SharedDataModule(){
                            @Override
                            public SharedData providesSharedData(Application application) {
                                return sharedData;
                            }
                        })
                        .threadsModule(new ThreadsModule())
                        .build();
                ((Nerfy) getTargetContext().getApplicationContext()).setAppComponent(espressoAppComponent);
                super.beforeActivityLaunched();
            }
        };

@Before
public void setUp() {
}

@Test
    @SdkSuppress(minSdkVersion = 23)
    public void a_shouldDisplayLocationPermissionRequestDialogAtStartup() throws Exception {
        assertViewWithTextIsVisible(device, TEXT_ALLOW);
        assertViewWithTextIsVisible(device, TEXT_DENY);
        denyCurrentPermission(device);
    }

什么都不能打印出来。

但如果我把模拟的共享数据转换成真实的数据

@Override
public SharedData providesSharedData(Application application) {
      return super.providesSharedData(application);

嘲弄一些其他模块也会带来相同的结果,而嘲弄其他模块工作良好。

有什么想法吗?

共有1个答案

印宏阔
2023-03-14

我已经测试了其他模块。发现被嘲弄的刷新模块会使测试进程崩溃,因为它有可观察的字段。被测试的活动尝试在其上订阅,但它为空。

SharedData更难弄清楚--它处理共享的首选项,所以基本上只有字符串和布尔值。我必须检查所有的用法。当尝试将字符串值作为url(未被嘲弄,因此再次为null)放入Picasso以获取图像时,崩溃发生了。

故事的寓意--一条正确的崩溃消息抵得上两天的盲目调试。

 类似资料:
  • 问题内容: 每当我想测试使用资源注入的类时,我最终都会包含一个仅在测试中使用的构造函数: 还有另一种模拟资源注入的方式,或者这是遵循的正确模式吗? 问题答案: 您可以使用简单的光泽效果,它可以模拟EJB注入系统。 另一种方法是在测试中使用反射来设置字段,我有时使用类似这样的内容:

  • 我们有一些传统的laravel项目,它们在类中使用正面。 我们最近的项目使用了底层laravel类的依赖注入,facades所代表的类正如Taylor Otwell自己所暗示的那样。(我们对每个类使用构造函数注入,但为了保持示例简短,这里我使用方法注入并使用单个类。) 我知道外表是可以被嘲笑的 这对单元测试很有效。我试图理解的问题是,这些门面是否被“全球”嘲笑。 例如,让我们假设我正在编写一个集成

  • 遇到了另一个常见的问题,同时为Spring Batch编写单元测试和集成测试组件是如何模拟域对象。一个很好的例子是StepExecutionListener,如下所示: public class NoWorkFoundStepExecutionListener extends StepExecutionListenerSupport { public ExitStatus afterSte

  • 我有一个Spring Boot应用程序和服务,里面有私有的道场。私有DAO属性使用进行注释(没有设置器或构造器设置它,只有注释)。我试图为服务编写Spock测试,但找不到如何将模拟DAO注入变量。

  • 简介 在 Laravel 应用程序测试中,你可能希望「模拟」应用程序的某些功能的行为,从而避免该部分在测试中真正执行。例如:在控制器执行过程中会触发事件(Event),从而避免该事件在测试控制器时真正执行。这允许你在仅测试控制器 HTTP 响应的情况时,而不必担心触发事件。当然,你也可以在单独的测试中测试该事件逻辑。 Laravel 针对事件、任务和 Facades 的模拟,提供了开箱即用的辅助函

  • #使用Mocks测试 在现实世界的应用程序中,我们的组件很可能具有外部依赖性。当为组件编写单元测试时,如果我们可以模拟这些外部依赖性,以使我们的测试仅依赖于被测试组件的行为,这将是理想的。 vue-loader提供了一个特性,它允许你使用inject-loader向*.vue组件注入任意依赖项。一般的想法是,不是直接导入组件模块,我们使用inject-loader为该模块创建一个“模块工厂”函数。