2012-11-04 32 views
6

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?

Trả lời

2

dường như thay đổi SDK Java trong cài đặt dự án của Intellij thành Oracle thay vì OpenJDK đã khắc phục sự cố này cho tôi.

+0

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

Các vấn đề liên quan