- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经从这里、github 和 robolectric 博客阅读了很多链接,但还没有找到可行的解决方案(已经使用 Robolectric 2.0 alpha 2)。
更新:即使我们将 SherlockFragment
替换为 android.support.v4.app.Fragment
也会出现此问题。
遵循此 tip 后,我能够测试 SherlockFragmentActivity ,但是当我将这个 fragment (即 SherlockFragment)添加到我的 Activity xml 时:
<fragment
android:name="com.marcelopazzo.fragmentapplication.ExampleFragment"
android:id="@+id/example_fragment"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
SherlockFragment 类:
public class ExampleFragment extends SherlockFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.example_fragment, container, false);
}
}
这是被 fragment 膨胀的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/hello_again"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_again" />
</LinearLayout>
我收到以下错误:
java.lang.NullPointerException
at org.robolectric.shadows.ShadowViewGroup.addView(ShadowViewGroup.java:69)
at android.view.ViewGroup.addView(ViewGroup.java)
at org.robolectric.res.builder.LayoutBuilder.constructFragment(LayoutBuilder.java:150)
at org.robolectric.res.builder.LayoutBuilder.create(LayoutBuilder.java:104)
at org.robolectric.res.builder.LayoutBuilder.doInflate(LayoutBuilder.java:42)
at org.robolectric.res.builder.LayoutBuilder.doInflate(LayoutBuilder.java:45)
at org.robolectric.res.builder.LayoutBuilder.inflateView(LayoutBuilder.java:62)
at org.robolectric.shadows.ShadowLayoutInflater.inflate(ShadowLayoutInflater.java:50)
at org.robolectric.shadows.ShadowLayoutInflater.inflate(ShadowLayoutInflater.java:55)
at android.view.LayoutInflater.inflate(LayoutInflater.java)
at com.squareup.test.ActionBarSherlockRobolectric.setContentView(ActionBarSherlockRobolectric.java:38)
at com.actionbarsherlock.app.SherlockFragmentActivity.setContentView(SherlockFragmentActivity.java:262)
at com.marcelopazzo.fragmentapplication.MainActivity.onCreate(MainActivity.java:13)
at com.marcelopazzo.fragmentapplication.MainActivityTest.setUp(MainActivityTest.java:33)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:110)
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:234)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:133)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:114)
at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:188)
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:166)
at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:86)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:101)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:74)
这是我正在使用的测试类:
@RunWith(RobolectricTestRunner.class)
public class MainActivityTest {
private MainActivity activity;
private TextView textView;
public static final String GREETINGS = "Hello world!";
@Before
public void setUp() {
ActionBarSherlock.registerImplementation(ActionBarSherlockRobolectric.class);
ActionBarSherlock.unregisterImplementation(ActionBarSherlockNative.class);
ActionBarSherlock.unregisterImplementation(ActionBarSherlockCompat.class);
activity = new MainActivity();
activity.onCreate(null);
textView = (TextView) activity.findViewById(R.id.hello);
}
@Test
public void shouldGreet() {
assertEquals(GREETINGS, textView.getText());
}
}
应用程序在设备上运行良好。
我在这里错过了什么?
ps:完整的源代码可以在github上找到。
编辑:还使用 square/master (2.0 alpha 3 square 5) 分支的代码进行了测试并遇到了同样的问题。检查 LayoutBuilder.constructFragment
,我认为问题是 activity.getSupportFragmentManager().beginTransaction().add(fragment, tag).commit()
无法使用SherlockFragment,所以 fragment.getView()
返回 null。
我不确定我是否可以做任何事情来解决这个问题......我已经在检查我是否可以在 robolectric 方面修复它,如果有人对此有任何提示,请告诉我。
最佳答案
您可以尝试使用 Robolectric 2.0 的新 ActivityController,它修复了一些经常出现的调度/操作顺序问题。
MainActivity activity = Robolectric.buildActivity(MainActivity.class)
.create().get();
它安排主循环程序在调用 onCreate() 期间暂时暂停。
关于android - Robolectric:如何测试包含 SherlockFragment 的 Activity ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16179675/
使用以下代码时出现以下错误 SherlockFragment 类型的 onKeyDown(int, KeyEvent) 方法未定义 public boolean onKeyDown(int KeyC
我正在尝试从 colors.xml 中获取颜色,使用的是 view.setBackgroundColor(getResources().getColor(R.color.bgcolor_view));
我想在我的 fragment 中启用主页按钮。这个问题之前被问过,但是为了一个 Activity 。 我试过了…… getSupportActionBar().setDisplayHomeAsUpE
我在选项卡中使用 sherlock fragment ,但我无法访问 sharedpreference 或保存它,我该怎么办?这是我的代码: public class SettingsActivit
我想将我的应用程序(扩展 Activity)更改为 Fragment(扩展 SherlockFragment) 如果我改变它我有很多错误; public class AlarmClock extend
在我的应用程序中,我有一个扩展 SherlockFragmentActivity 的类。在该 Activity 中,我正在加载四个扩展 SherlockFragment 的类,它在 Actionbar
我是 Android 新手。当启动连接到 SQLite DB 时遇到问题。基本上,它的连接打开是从 Android Activity 调用的工作。在我的场景中,我使用了 SherlockFragmen
您好,我想在 sherlockfragment 中创建一个点击监听器,但每次点击它时,它都会显示“view.class source not found”,无论我做什么操作,我想用它来启动一个 Int
遇到以下错误的问题 该类型的 getIntent() 方法未定义 使用以下扩展 SherlockFragment { 代码 public View onCreateView(LayoutInflate
我有以下内容: 1) MyActivity 扩展 SherlockFragmentActivity 2) MyMapFragment 扩展 SherlockFragment 3) 在 MyMapFra
我有扩展 SherlockFragmentActivity 的 MainActivity 和两个带有 SherlockFragment 的选项卡。这两个选项卡的 ListView 由 AsyncTas
我的主 Activity 中有两个选项卡(我使用 ActionBarSherlock)。我的 fragment 加载并解析远程 xml 以填充 ListView 。 如果我在 fragment 完全加
我有一个带 ABS 的操作栏标签系统。第一个选项卡是登录选项卡。我将登录用户存储在本地 SQLite 数据库和 Web SQL 数据库中。当用户点击 loginButton 并且 Async logi
我正在尝试制作一个 ImageView,它在图形 View 中显示,但是当我在我的设备和模拟器上运行它时,图像没有显示。这是我的 XML 代码。 这是我的 Fragment1 代码(我使用 Fra
在我的应用程序中有一个 SherlockFragmentActivity,它有 6 个 fragment 。其中一个 fragment 包含 map fragment 。 问题:现在的问题是,当我启动
我已经从这里、github 和 robolectric 博客阅读了很多链接,但还没有找到可行的解决方案(已经使用 Robolectric 2.0 alpha 2)。 更新:即使我们将 Sherlock
我真的很难在我的 Sherlock fragment 中设置 onCreateOptionsMenu 方法,因为我通常不会那么多地使用 Sherlock fragment 。有人可以告诉我必须导入什么
所以我有 3 个 Sherlock Fragments 设置并且可以与 ViewPageIndicator 一起正常工作。我现在想做的是将 TabHost 放入其中一个 Fragments 中,以便它
我有一个 SherlockFragment,它在 SherlockActivity 中膨胀时可以正常工作。我在 onCreate() 上设置了 setHasOptionsMenu(true) 并且正确
我正在尝试使用 SimpleCursorAdapter 在 Sherlock-fragment 中显示 ListView 。在模拟器上显示空布局 - 没有 ListView 。 我的SherlockF
我是一名优秀的程序员,十分优秀!