我有一个常规的JUnit测试用例来测试非android方法逻辑.该方法将TextUtils用于TextUtils.isEmpty()之类的东西.
我只是为了引入TextUtils类而使它成为AndroidTestCase是没有意义的.有没有更好的方法来测试这个单元测试?喜欢将android.jar添加到测试项目或其他什么?
与我想要模拟Context对象的另一个测试类似的情况.如果不扩展AndroidTestCase,我无法嘲笑它.在这些情况下,我只是尝试测试非Android逻辑并且不希望它在模拟器上运行,但它触及一些Android类的最佳实践是什么?
谢谢
可以在Android Studio中的这两种测试模式之间共享代码吗?我有一套Mock Utils类,我需要在两种测试模式下访问.
如何在调用onCreate之前获取Activity的引用.而它的测试.我使用ActivityTestRule作为JUnit规则.这个要求的原因是我想从测试中将Mocks注入活动.
public class MyActivity extends Activity{
MyComponent myComponent;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
if(myComponent==null){
myComponent ... //initialise dagger component
}
myComponent.inject(this);
...
}
public void setComponent(MyComponent comp){
this.myComponent = comp;
}
}
public class MyTest{
@Rule
public ActivityTestRule<MyActivity> intentsTestRule = new ActivityTestRule<>(MyActivity.class);
MyComponent myFakeComponent;
@Before
public void setUp() {
MyActivity activity = intentsTestRule.getActivity();
activity.setComponent(myFakeComponent);
}
@Test
public void testMethod1(){...}
}
Run Code Online (Sandbox Code Playgroud) 如何单元测试android SensorEvent和MotionEvent类?
我需要MotionEvent为单元测试创建一个对象.(我们有模拟创建自定义对象后可以使用的obtain方法)MotionEventMotionEvent
对于MotionEvent类,我试过Mockito像:
MotionEvent Motionevent = Mockito.mock(MotionEvent.class);
Run Code Online (Sandbox Code Playgroud)
但是我在Android Studio上遇到错误:
java.lang.RuntimeException:
Method obtain in android.view.MotionEvent not mocked. See https://sites.google.com/a/android.com/tools/tech-docs/unit-testing-support for details.
at android.view.MotionEvent.obtain(MotionEvent.java)
Run Code Online (Sandbox Code Playgroud)
关于此错误提到的网站,我已添加
testOptions {
unitTests.returnDefaultValues = true
}
Run Code Online (Sandbox Code Playgroud)
在build.gradle上,但我仍然得到同样的错误.有什么想法吗?
我正在为底部工作表创建一个浓缩咖啡测试,其中工作表有 5 个线性排列的文本视图,第一个文本视图可见,单击第一个文本视图将展开整个底部工作表,显示所有项目,然后需要单击第三个项目要通过的测试。
问题是浓缩咖啡在展开后不会单击底部工作表的文本视图,直到我将Thread.sleep(1000).
我什至尝试过 IdlingResource,一旦在第一个项目上注册了点击,我就把它设置为 false,在 bottomSheetBehaviour 上调用 onStateChanged 之后,我再次将它设置为 true,但仍然没有帮助。
这不起作用:
onView(withId(R.id.toolsItem1)).perform(click());
onView(withId(R.id.toolsItem3)).check(matches(isDisplayed()));
onView(withId(R.id.toolsItem3)).perform(click());
Run Code Online (Sandbox Code Playgroud)
这确实:
onView(withId(R.id.toolsItem1)).perform(click());
Thread.sleep(1000);
onView(withId(R.id.toolsItem3)).check(matches(isDisplayed()));
onView(withId(R.id.toolsItem3)).perform(click());
Run Code Online (Sandbox Code Playgroud) 发现多个文件与操作系统无关的路径'mockito-extensions/org.mockito.plugins.MockMaker'在添加时出现此错误
androidTestImplementation "org.mockito:mockito-inline:2.15.0"
在 gradle 中模拟最后一堂课
最近我展示了一个关于 androidX 测试的谷歌 IO 视频,其中引用了“一次编写,到处运行”。这让我很高兴了解 androidX 测试库。
我发现经过很长时间谷歌为开/关设备的单元测试和仪器测试提出了很好的单一库。但是我发现在开/关设备上运行相同的测试有些困难。
基本上在 Android 中,我们创建了两个源根test/java,androidTest/java分别存储单元测试和仪器测试。单元测试在 JVM 上运行,Instrumentation 在设备/模拟上运行。
然后我为test/java目录中的片段之一编写了测试。
@RunWith(AndroidJUnit4::class)
class MyFragmenTest {
lateinit var scenario: FragmentScenario<MyFragment>
@Before
fun setUp() {
scenario = launchFragmentInContainer<MyFragment>()
}
@Test
fun `sample test`() {
scenario.onFragment {
// something
}
// some assertion
}
}
Run Code Online (Sandbox Code Playgroud)
所以当我使用小的绿色运行图标执行这个测试时,它在没有模拟器的 JVM 中运行这个测试,这很棒。但是要在设备上运行相同的测试,我必须移动此代码androidTest/java源根目录。
基本上我得到了相同的测试可以在任何地方运行,当我们使用 androidX 测试库时,您不必依赖不同的工具和库来完成相同的工作。
我试过的。
之后,在 google 上搜索我发现我们必须sharedTest/java使用下面的 gradle 行创建源根目录,以便它可以在设备上或设备外运行。
android {
...
sourceSets {
androidTest {
java.srcDirs += "src/sharedTest/java"
}
test …Run Code Online (Sandbox Code Playgroud) android android-testing android-jetpack androidx androidx-test
执行单元测试时出现以下错误
java.lang.AssertionError: Activity never becomes requested state "[CREATED, STARTED, RESUMED, DESTROYED]" (last lifecycle transition = "PRE_ON_CREATE")
at androidx.test.core.app.ActivityScenario.waitForActivityToBecomeAnyOf(ActivityScenario.java:338)
at androidx.test.core.app.ActivityScenario.launchInternal(ActivityScenario.java:272)
at androidx.test.core.app.ActivityScenario.launch(ActivityScenario.java:238)
at androidx.test.ext.junit.rules.ActivityScenarioRule.lambda$new$3$ActivityScenarioRule(ActivityScenarioRule.java:98)
at androidx.test.ext.junit.rules.ActivityScenarioRule$$Lambda$3.get(Unknown Source:4)
at androidx.test.ext.junit.rules.ActivityScenarioRule.before(ActivityScenarioRule.java:103)
at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:46)
Run Code Online (Sandbox Code Playgroud)
我的测试代码
@RunWith(AndroidJUnit4::class)
@LargeTest
class TestHomePageFragment {
private val intent = Intent(ApplicationProvider.getApplicationContext(), AudioPlayerActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK
putExtra(HomePageArouterConstants.KEY_ID,"1")
}
@get:Rule
val activityRule:ActivityScenarioRule<AudioPlayerActivity> = activityScenarioRule(intent)
@Test
fun testVote(){
// Assert.assertEquals(1,1)
val scenario = activityRule.scenario
scenario.moveToState(Lifecycle.State.RESUMED)
onView(withId(R.id.linear_layout_like)).perform(click())
}
}
Run Code Online (Sandbox Code Playgroud)
谁有这个问题的想法?
我在我的MainActivityTest班级中配置了如下权限规则
@Rule
public GrantPermissionRule permissionRule =
GrantPermissionRule.grant(RECORD_AUDIO, WRITE_EXTERNAL_STORAGE);
Run Code Online (Sandbox Code Playgroud)
当我运行以下命令以使用 api 27 在模拟器上执行测试时
./gradlew connectedCheck
Run Code Online (Sandbox Code Playgroud)
它失败并出现以下错误
com.example.myapplication.MainActivityTest > testLaunch_main_activity[Pixel_XL_API_27(AVD) - 8.1.0] FAILED
androidx.test.espresso.NoActivityResumedException: No activities in stage RESUMED. Did you forget to launch the activity. (test.getActivity() or similar)?
at dalvik.system.VMStack.getThreadStackTrace(Native Method)
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,权限在应用程序信息设置中显示为已授予,但在 api 版本 27(或更低版本)的模拟器上运行测试时仍然要求权限
有人可以确认这是否是某些 android 插件中的错误,或者我在这里遗漏了什么。
android android-fragments android-testing android-permissions androidx
我有以下 android 测试类
@HiltAndroidTest
@UninstallModules(PreferencesModule::class, CacheModule::class)
class PlayerRepositoryTest {
private val fakeServer = FakeServer()
private lateinit var repository: PlayerRepository
private lateinit var api: GameApi
private lateinit var cache: Cache
@get: Rule
var hiltRule = HiltAndroidRule(this)
@get: Rule
var instantTaskExecutorRule = InstantTaskExecutorRule()
@Inject
lateinit var database: GameDatabase
@Inject
lateinit var retrofitBuilder: Retrofit.Builder
@Inject
lateinit var apiPlayerMapper: ApiPlayerDetailsMapper
@Inject
lateinit var apiPaginationMapper: ApiPaginationMapper
@BindValue
@JvmField
val preferences: Preferences = FakePreferences()
@Module
@InstallIn(SingletonComponent::class)
object TestCacheModule {
@Provides
fun provideRoomDatabase(): GameDatabase {
return Room.inMemoryDatabaseBuilder( …Run Code Online (Sandbox Code Playgroud) android ×10
android-testing ×10
androidx ×2
mockito ×2
bottom-sheet ×1
dagger-hilt ×1
gradle ×1
junit ×1
junit-rule ×1
kotlin ×1
mocking ×1
testing ×1
unit-testing ×1