- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
Android Studio 3.2 Canary 2
Build #AI-173.4591728, built on February 8, 2018
JRE: 1.8.0_152-release-1024-b01 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Linux 4.14.18-300.fc27.x86_64
我有以下 Activity ,我想对 fragment 已附加并应返回非空值的情况进行单元测试。并且应该属于else条件:
这是我的 Activity :
public class BillingActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.billing_container);
if(getSupportFragmentManager().findFragmentByTag(BillingView.TAG) == null) {
final FragmentTransaction fragmentTransaction =
getSupportFragmentManager().beginTransaction();
fragmentTransaction.add(
R.id.billing_view_container,
BillingView.newInstance(),
BillingView.TAG);
fragmentTransaction.commit();
}
else {
Timber.d("Fragment already attached");
}
}
}
测试类是这样的:我可以编写附加 fragment 的测试,但我想测试 fragment 已经附加并且应该返回非空的条件。
class BillingActivityTest: BaseRobolectricTestRunner() {
private lateinit var billingActivity: BillingActivity
@Before
fun setup() {
billingActivity = Robolectric.buildActivity(BillingActivity::class.java)
.create()
.start()
.get()
}
@Test
fun testBillingActivityIsNotNullValue() {
assertThat(billingActivity, `is`(notNullValue()))
}
@Test
fun testBillingFragmentHasStarted() {
val actualFragment = billingActivity
.supportFragmentManager
.findFragmentByTag(BillingView.TAG)
assertThat(actualFragment.tag, `is`(BillingView.TAG))
}
@Test
fun testBillingFragmentAlreadyAttached() {
/* how to test */
}
}
感谢您的任何建议,
最佳答案
方法you've chosen (使用 recreate()
)只要它复制您请求的行为就可以工作。我相信这是目前最短的方法。
尽管如此,我不能认为它是一个纯粹的单元测试,因为实际上你在作弊,因为显然你对 Activity 的 recreate()
Action 不感兴趣(不妨来有副作用)。
如果您想执行纯单元测试,那么这里就是执行此操作的方法。声明 Activity 如下:
class MainActivity : AppCompatActivity() {
internal var fragmentManagerRetriever = FragmentManagerRetriever()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val fragmentManager = fragmentManagerRetriever.getFragmentManager(this)
if (fragmentManager.findFragmentByTag("TAG") == null) {
val fragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction.add(SomeFragment(), "TAG")
fragmentTransaction.commit()
}
}
}
FragmentManagerRetriever
就这么简单:
class FragmentManagerRetriever {
public FragmentManager getFragmentManager(FragmentActivity activity) {
return activity.getSupportFragmentManager();
}
}
那么你有一个接缝来执行纯单元测试:
@Test
fun nullCase() {
val activityController = Robolectric.buildActivity(MainActivity::class.java)
val activity = activityController.get()
val fragmentManagerRetriever = mock(FragmentManagerRetriever::class.java)
val fragmentManager = mock(FragmentManager::class.java)
val fragmentTransaction = mock(FragmentTransaction::class.java)
activity.fragmentManagerRetriever = fragmentManagerRetriever
`when`(fragmentManagerRetriever.getFragmentManager(activity)).thenReturn(fragmentManager)
`when`(fragmentManager.findFragmentByTag("TAG")).thenReturn(null)
`when`(fragmentManager.beginTransaction()).thenReturn(fragmentTransaction)
activityController.create()
val inOrder = Mockito.inOrder(fragmentTransaction)
inOrder.verify(fragmentTransaction).add(ArgumentMatchers.any(SomeFragment::class.java), ArgumentMatchers.eq("TAG"))
inOrder.verify(fragmentTransaction).commit()
}
以及对非空情况的测试:
@Test
fun nonNullCase() {
val activityController = Robolectric.buildActivity(MainActivity::class.java)
val activity = activityController.get()
val fragmentManagerRetriever = mock(FragmentManagerRetriever::class.java)
val fragmentManager = mock(FragmentManager::class.java)
val fragmentTransaction = mock(FragmentTransaction::class.java)
activity.fragmentManagerRetriever = fragmentManagerRetriever
`when`(fragmentManagerRetriever.getFragmentManager(activity)).thenReturn(fragmentManager)
`when`(fragmentManager.findFragmentByTag("TAG")).thenReturn(mock(Fragment::class.java))
activityController.create()
verifyZeroInteractions(fragmentTransaction)
}
关于android - findFragmentByTag 的单元测试条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48812927/
我有一个问题 findFragmentByTag 总是返回 null;所以我想解决这个问题。 我在支持 v4 上尝试了相同的操作,但这总是返回 null 主要 Activity :` public c
Android Studio 3.2 Canary 2 Build #AI-173.4591728, built on February 8, 2018 JRE: 1.8.0_152-release-
我只是一个android开发的初学者,最近我在developer.android.com上开始了Android教程。一切看起来都很好,直到现在。我正在做这门类(class)http://develop
我无法理解为什么 findFragmentByTag() 在我的代码中返回 null。我在我的 fragment onCreate() 上设置了 setRetainInstance(true) 并且我
我有一个 fragment 开始另一个 fragment 。我需要从第二个访问第一个 fragment 的方法。但是我遇到了一个奇怪的错误。 有没有人有解决这个问题的想法? 首先: public cl
我哪里错了。我只想检查具有给定 ProductId 的 fragment 是否已在 BackStack 中可用; 如果是,则不要添加新 fragment ,否则将当前 fragment 添加到后台堆栈
我创建了一个 fragment 来显示我的回收站 View 。所以我使用方法 findFragmentById() 来查找我的 xml 文件。问题是每次我旋转屏幕时,它都会在另一个之上创建一个回收器
我正在尝试通过获取容器中的当前 fragment 并调用其方法来更新我的 UI。我的布局如下所示: 我像这样在 Fragments(android
当 FragmentManager.findFragmentByTag("tag") 返回 null 时,我发现了一种特殊情况。 我有一种直觉,这与时间有关? 我有一个包含以下回调的网络库: onSt
我正在使用 Android 支持库 (v4) 和 ActionBarSherlock。我正在尝试以编程方式关闭进度对话框。我编写了一个小型实用程序类来帮助进行对话框管理。 对话框从 AsyncTask
我有一个父 FragmentActivity 和三个子 Tab Fragment。当在 FragmentActivity 上按下“提交”按钮时,我想对不同选项卡 fragment 中所有 EditTe
我环顾四周,发现了几个主题相似的问题,但对我的情况没有任何帮助。我正在尝试使用 getSupportFragmentManager().findFragmentByTag(TAG) 访问现有的 Act
在我的应用程序中,我有一个主要 Activity 和几个 fragment 。当用户单击后退按钮时, fragment 一个接一个地弹出。我想确定当前在返回堆栈中的 fragment 。所以用来通过
getFragmentManager().beginTransaction() .replace(R.id.graph_fragment_holder, new Gra
我想抑制一个 FindBugs 警告,该警告看到转换了一个通过 findFragmentByTag(String) 获得的 Fragment。这是当前代码: 我正在关注 htt
我正在尝试从我的 fragmentTabHost 中检索 fragment : private void initView() { FragmentTabHost mTabHost = (Fr
我想从其父 Activity 中调用 fragment 方法。为此,我想要 fragment 对象。 父 Activity 在框架布局中有这样的 fragment :
更重要的是,在 onCreate/onCreateView 中,我已经调用 FragmentManager.findFragmentByTag() 来查找我的 fragment 的任何现有实例,它似乎
由于我在 Android findFragmentByTag() 中进行了 null 检查,代码检查建议我添加 Objects.requireNonNull() 方法。当我应用此检查时,代码检查不再发
我已经通过 DialogFragment 创建了一个进度对话框,为此我使用这篇文章作为我的 DialogFragment 的基础:https://gist.github.com/daichan4649
我是一名优秀的程序员,十分优秀!