我正在尝试在执行数据库插入的应用程序存储库类中测试这个函数。我正在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) 我有一个应用程序,它有一个底部菜单栏,用户可以使用它在 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) 我是扑的新手。我实现了这个示例应用程序以了解 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) 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) 我打算用来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开发自定义视图.为此我想让用户能够选择和使用图像,就像使用时一样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 ×5
koin ×2
kotlin ×2
android-architecture-navigation ×1
bitmap ×1
dart ×1
flutter ×1
flutter-moor ×1
unit-testing ×1