Tôi đã đọc rất nhiều liên kết từ đây, blog github và robolectric nhưng không thể tìm thấy giải pháp làm việc nào (đã sử dụng Robolectric 2.0 alpha 2).Robolectric: Làm thế nào tôi có thể kiểm tra một hoạt động có chứa một SherlockFragment?
CẬP NHẬT: Sự cố cũng xảy ra ngay cả khi chúng tôi thay thế SherlockFragment
cho android.support.v4.app.Fragment
.
tôi đã có thể thử nghiệm một SherlockFragmentActivity sau khi làm theo tip này, nhưng khi tôi thêm đoạn này, đó là một SherlockFragment, để hoạt động xml của tôi:
<fragment
android:name="com.marcelopazzo.fragmentapplication.ExampleFragment"
android:id="@+id/example_fragment"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
Lớp 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);
}
}
Và đây là bố cục đang được tăng thêm bởi đoạn:
<?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>
tôi nhận được lỗi sau:
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)
Đây là lớp học thử nghiệm mà tôi đang sử dụng:
@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());
}
}
Ứng dụng này đang làm việc tốt trên các thiết bị.
Tôi thiếu gì ở đây?
ps: Các mã nguồn đầy đủ có sẵn trên github
Edit: Ngoài ra thử nghiệm với mã từ vuông/master (2.0 alpha 3 vuông 5) chi nhánh và có cùng một vấn đề. Kiểm tra LayoutBuilder.constructFragment
, tôi nghĩ rằng vấn đề là activity.getSupportFragmentManager().beginTransaction().add(fragment, tag).commit()
không hoạt động với SherlockFragment, vì vậy fragment.getView()
sẽ trả về giá trị rỗng.
Tôi không chắc chắn liệu mình có thể làm bất cứ điều gì để sửa lỗi này không ... Tôi đã kiểm tra xem tôi có thể sửa nó trên mặt của robolectric hay không, vui lòng cho tôi biết nếu có ai có mẹo này.
Hi @Xian, nhờ trả lời. Tôi vừa thử nghiệm với 2.0-rc1 và 2.0-rc2-SNAPSHOT. Vẫn nhận được một NPE java.lang.NullPointerException: null \t tại android.view.ViewGroup.addView (ViewGroup.java:3187) \t tại android.view.ViewGroup.addView (ViewGroup.java:3170) \t tại org .robolectric.res.builder.LayoutBuilder.constructFragment (LayoutBuilder.java:150) – marcelopazzo
Đã đẩy mã cập nhật lên [github] (https://github.com/marcelopazzo/RobolectricSample). Ngoài ra phát hiện ra rằng điều này không liên quan đến ActionBarSherlock, tôi nhận được các lỗi tương tự bằng cách sử dụng android.support.v4.app.Fragment. – marcelopazzo
Sự cố đã được khắc phục trên robolectric 2.1 – marcelopazzo