小编Cha*_*hna的帖子

如何在单元测试中获取上下文以在内存数据库对象中创建 Room 数据库

我正在尝试在执行数据库插入的应用程序存储库类中测试这个函数。我正在Koin用作我的依赖注入库。为了进行测试,我需要创建一个内置于内存的数据库版本。要创建该数据库,我需要 Android 应用程序上下文。所以我创建了我的测试类,如下所示。

import android.content.Context
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import androidx.room.Room
import androidx.test.core.app.ApplicationProvider
import androidx.test.platform.app.InstrumentationRegistry
import com.chathuranga.shan.mycontacts.di.applicationModule
import com.chathuranga.shan.mycontacts.di.repositoryModule
import com.chathuranga.shan.mycontacts.room.AppDatabase
import org.junit.After
import org.junit.Test

import org.junit.Before
import org.junit.Rule
import org.koin.android.ext.koin.androidContext
import org.koin.core.context.loadKoinModules
import org.koin.core.context.startKoin
import org.koin.core.context.stopKoin
import org.koin.dsl.module
import org.koin.test.KoinTest
import org.koin.test.inject
import org.mockito.MockitoAnnotations

class ContactRepositoryTest : KoinTest {

    private val contactRepository: ContactRepository by inject()
    private lateinit var appDatabase: AppDatabase

    @get:Rule
    val rule = InstantTaskExecutorRule()

    @Before
    fun setUp() {

        startKoin {
            printLogger()
            modules(listOf(applicationModule,repositoryModule))
        }

        MockitoAnnotations.initMocks(this)

        val context = ApplicationProvider.getApplicationContext<Context>() …
Run Code Online (Sandbox Code Playgroud)

android unit-testing kotlin koin

8
推荐指数
1
解决办法
3308
查看次数

使用带有导航架构组件的底部菜单栏时如何从工具栏中删除后退按钮

我有一个应用程序,它有一个底部菜单栏,用户可以使用它在 4 个主页选项卡之间切换。它工作正常,如下所示。

在此处输入图片说明

我遇到的唯一问题是当我在不同片段之间切换时它会显示后退按钮。由于所有这些片段都处于同一级别,我不希望它表现得那样。

这是我的实现。

主导航活动

class MainNavigationActivity : AppCompatActivity() {

    private lateinit var navigationController: NavController

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        initialization()
    }

    private fun initialization(){

        navigationController = Navigation.findNavController(this, R.id.hostFragment)

        setSupportActionBar(toolbar)
        NavigationUI.setupWithNavController(bottomNavigationBar,navigationController)
        NavigationUI.setupActionBarWithNavController(this,navigationController)
    }

override fun onBackPressed() {
        onSupportNavigateUp()
    }
Run Code Online (Sandbox Code Playgroud)

MainNavigationActivity 布局

<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".activities.MainNavigationActivity">

    <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:background="@color/colorPrimary"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>

    <fragment
            android:id="@+id/hostFragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/toolbar"
            android:layout_above="@id/bottomNavigationBar"
            app:defaultNavHost="true"
            app:navGraph="@navigation/main_navigation_graph" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/bottomNavigationBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:background="@android:color/white"
            app:menu="@menu/bottom_navigation_menu"
            app:labelVisibilityMode="labeled"/>

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

bottom_navigation_menu.xml

<menu …
Run Code Online (Sandbox Code Playgroud)

android android-architecture-navigation

7
推荐指数
2
解决办法
6458
查看次数

Flutter StreamProvider 不将数据推送到 UI

我是扑的新手。我实现了这个示例应用程序以了解 SQLite 和提供程序状态管理。这是一个简单的任务管理系统。我使用 MOOR 来处理 SQLite 数据库。我遇到的问题是任务列表在添加任务后没有更新。如果我重新启动应用程序,我可以看到该任务已成功保存在数据库中。

泊位查询实现

Future<List<Task>> getAllTasks() => select(tasks).get();
Stream<List<Task>> watchAllTasks() => select(tasks).watch();
Future<int> insertTask(TasksCompanion task) => into(tasks).insert(task);
Run Code Online (Sandbox Code Playgroud)

任务库

在这里,我将粘贴整个类以了解有关我的实现的想法。

class TaskRepository{

  Stream<List<DisplayTaskData>> getAllTasks(){

    var watchAllTasks = AppDatabase().watchAllTasks();
    final formattedTasks = List<DisplayTaskData>();

    return watchAllTasks.map((tasks) {

      tasks.forEach((element) {

        var date = element.dueDate;
        String dueDateInString;

        if(date != null){
          dueDateInString = ""
              "${date.year.toString()}-"
              "${date.month.toString().padLeft(2,'0')}-"
              "${date.day.toString().padLeft(2,'0')}";
        }

        var displayTaskData = DisplayTaskData(task : element.task, dueDate: dueDateInString);
        formattedTasks.add(displayTaskData);

      });

      return formattedTasks;

    });
  }

  Future<Resource<int>> insertTask(TasksCompanion task) async{

    try {

      int insertTaskId = await …
Run Code Online (Sandbox Code Playgroud)

dart flutter flutter-moor

6
推荐指数
1
解决办法
756
查看次数

Koin dependency override is not working in testing

I'm new to testing and I adapted Koin as my dependency injection. my application is working fine. it's still having a login function. Here's my dependency class

Modules.kt

val applicationModule = module (override = true) {
    single { NetworkService.getInstance().getService(APIService::class.java) }
    single { PreferenceManager.getDefaultSharedPreferences(androidContext()) }
}

val activityModule = module {

    scope(named<LoginActivity>()) {
        scoped { (activity: LoginActivity) ->
            Navigation
                .findNavController(activity, R.id.hostFragment)
        }
    }

    scope(named<MainNavigationActivity>()) {
        scoped { (activity: MainNavigationActivity) ->
            Navigation
                .findNavController(activity, R.id.hostFragment)
        }
    }
}

val viewModelModule = module { …
Run Code Online (Sandbox Code Playgroud)

android kotlin koin

5
推荐指数
1
解决办法
1万
查看次数

当必须使用父活动引用时,如何使用“FragmentScenario”单独测试 Fragment

我打算用来FragmentScenario单独测试片段。在此片段中,我正在访问父活动以调用一些方法。为此,我正在使用CommonActivityOperations接口。我在此应用程序中使用导航架构组件。

interface CommonActivityOperations {
    fun closeSearchBar()
    fun navigateBackWithResult(resultFor: String, result: Bundle)
}
Run Code Online (Sandbox Code Playgroud)

当我尝试在我的设备上运行测试时,AttractionDestinationFragment出现以下错误。

java.lang.ClassCastException: androidx.fragment.app.testing.FragmentScenario$EmptyFragmentActivity cannot be cast to .interfaces.CommonActivityOperations

景点目的地片段

const val DESTINATION_DATA_EXTRA = "destination_data_result"

class AttractionDestinationFragment : BaseFragment(), ItemClickListener, ToolbarSearchChangeListener{

    private lateinit var navigationController: NavController
    private lateinit var defaultAttractionList: MutableList<AttractionDestinations>
    private lateinit var attractionDestinationRecyclerViewAdapter: AttractionDestinationRecyclerViewAdapter

    private val viewModel by lazy { getViewModel<AttractionDestinationViewModel>() }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_attraction_destination, container, false)
    }

    override fun onViewCreated(view: View, …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-testing android-espresso

5
推荐指数
1
解决办法
2007
查看次数

如何创建可绘制对象的位图

我正在为android开发自定义视图.为此我想让用户能够选择和使用图像,就像使用时一样ImageView

attr.xml中,我添加了以下代码.

<declare-styleable name="DiagonalCut">
    <attr name="altitude" format="dimension"/>
    <attr name="background_image" format="reference"/>
</declare-styleable>
Run Code Online (Sandbox Code Playgroud)

在自定义视图中,我得到的值Drawable是xml中提供的值app:background_image="@drawable/image"

TypedArray typedArray = getContext().obtainStyledAttributes(arr, R.styleable.DiagonalCut);
altitude = typedArray.getDimensionPixelSize(R.styleable.DiagonalCut_altitude,10);
sourceImage = typedArray.getDrawable(R.styleable.DiagonalCut_background_image);
Run Code Online (Sandbox Code Playgroud)

我想使用sourceImage它创建一个Bitmap ,这是一个Drawable对象.

如果我出错的方式请提供替代方案.

android bitmap android-custom-view android-canvas

2
推荐指数
1
解决办法
6550
查看次数