Tôi đang cố chạy thử nghiệm trên một Hoạt động mở rộng SherlockActivity. Tôi đọc tất cả những gì tôi có thể tìm về các giải pháp cho các hoạt động thử nghiệm với ActionBarSherlock và cũng đã cố gắng sau https://github.com/passy/absshadow-sampleRobolectric: cách kiểm tra SherlockActivity
đây là những gì tôi đang thực hiện:
kiểm tra tùy chỉnh Á hậu:
public class CustomTestRunner extends RobolectricTestRunner {
private static final int SDK_INT = Build.VERSION.SDK_INT;
public CustomTestRunner(Class<?> testClass) throws InitializationError {
super(testClass);
addClassOrPackageToInstrument("com.actionbarsherlock.app.SherlockActivity");
}
@Override
protected void bindShadowClasses() {
super.bindShadowClasses();
Robolectric.bindShadowClass(ShadowSherlockActivity.class);
}
@Override
public void beforeTest(final Method method) {
final int targetSdkVersion = robolectricConfig.getSdkVersion();
setStaticValue(Build.VERSION.class, "SDK_INT", targetSdkVersion);
}
@Override
public void afterTest(final Method method) {
resetStaticState();
}
@Override
public void resetStaticState() {
setStaticValue(Build.VERSION.class, "SDK_INT", SDK_INT);
}
}
shadow SherlockActivity:
@Implements(SherlockActivity.class)
public class ShadowSherlockActivity extends ShadowActivity {
@Implementation
public void setContentView(int layoutResID) {
super.setContentView(layoutResID); // TODO Auto-generated method stub
}
@Implementation
public ActionBar getSupportActionBar() {
return new ActionBar() {
// removed for readability
};
}
}
vì một lý do aways nó thất bại với điều này:
WARNING: you probably should have called setContentView() first
java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(Thread.java:1342)
at com.xtremelabs.robolectric.shadows.ShadowActivity.findViewById(ShadowActivity.java:183)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.xtremelabs.robolectric.bytecode.ShadowWrangler.methodInvoked(ShadowWrangler.java:99)
at com.xtremelabs.robolectric.bytecode.RobolectricInternals.methodInvoked(RobolectricInternals.java:144)
at android.app.Activity.findViewById(Activity.java)
at com.dgti.ds.activities.ChooseLocationActivity.findViews(ChooseLocationActivity.java:44)
at com.dgti.ds.activities.ChooseLocationActivity.onCreate(ChooseLocationActivity.java:34)
at com.dgti.ds.activities.ChooseLocationActivityTests.shouldGetGoogleAPIKeyIfNull(ChooseLocationActivityTests.java:81)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
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.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at com.xtremelabs.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:288)
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.junit.runner.JUnitCore.run(JUnitCore.java:157)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:76)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
hoạt động của tôi không gọi setContentView
đầu tiên, trước khi bất kỳ findViewById
.
phần lạ là không có vấn đề gì tôi làm trong việc thực hiện bóng của setContentView
, dường như không có gì xảy ra (ví dụ, ném một NullPojnterException
). bóng của tôi không nhận được đăng ký, như thể tôi cố gắng ghi đè lên việc thực hiện onCreate
và ném ngoại lệ ở đó, nó hoạt động.
Tôi thiếu gì ở đây?
Tôi có cùng một vấn đề mặc dù tôi đang sử dụng Oracle Java SDK, luôn luôn CẢNH BÁO: có thể bạn nên gọi setContentView() đầu tiên là bạn có mẹo/sửa chữa khác không? – vsm