2013-08-22 54 views
7

Vâng, tôi đang gặp một lỗi lạ. Khi tôi chạy thử nghiệm của tôi thông qua IntelliJ, nó đi mà không có bất kỳ vấn đề. Nhưng nếu tôi chạy nó bằng cách sử dụng các plugin chắc chắn lửa hoặc 'mvn sạch test' lệnh, tôi nhận được ngoại lệ sau đây:Nhận java.lang.RuntimeException: Stub khi chạy Robolectric qua Maven

shouldLoadMoreDataOnScrollBeyondTheThreshold(br.com.cybereagle.androidwidgets.listener.EndlessScrollListenerTest) Time elapsed: 2.73 sec <<< ERROR! 
java.lang.RuntimeException: Stub! 
    at junit.framework.Assert.assertTrue(Assert.java:6) 
    at br.com.cybereagle.androidwidgets.listener.EndlessScrollListenerTest.shouldLoadMoreDataOnScrollBeyondTheThreshold(EndlessScrollListenerTest.java:36) 
    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:616) 
    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.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:246) 
    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.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:181) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:59) 
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:120) 
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:103) 
    at org.apache.maven.surefire.Surefire.run(Surefire.java:169) 
    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:616) 
    at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:350) 
    at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1021) 

Đây là thử nghiệm của tôi:

@RunWith(RobolectricTestRunner.class) 
@Config(manifest = Config.NONE) 
public class EndlessScrollListenerTest { 

    private ListView listView; 
    private EndlessScrollListener endlessScrollListener; 

    @Before 
    public void setUp() throws Exception { 
     listView = mock(ListView.class); 

     when(listView.getHeaderViewsCount()).thenReturn(0); 
     when(listView.getFooterViewsCount()).thenReturn(0); 


     endlessScrollListener = spy(new TestEndlessScrollListener(5)); 
    } 

    @Test 
    public void shouldLoadMoreDataOnScrollBeyondTheThreshold() { 
     doReturn(true).when(endlessScrollListener).hasMoreDataToLoad(); 

     assertTrue(endlessScrollListener.isLoading()); 

     endlessScrollListener.onScroll(listView, 2, 5, 20); 

     assertFalse(endlessScrollListener.isLoading()); 

     endlessScrollListener.onScroll(listView, 15, 5, 20); 

     assertTrue(endlessScrollListener.isLoading()); 


     endlessScrollListener.onScroll(listView, 21, 5, 40); 

     assertFalse(endlessScrollListener.isLoading()); 

     endlessScrollListener.onScroll(listView, 35, 5, 40); 

     assertTrue(endlessScrollListener.isLoading()); 

     endlessScrollListener.onScroll(listView, 38, 5, 60); 

     assertFalse(endlessScrollListener.isLoading()); 

     doReturn(false).when(endlessScrollListener).hasMoreDataToLoad(); 

     endlessScrollListener.onScroll(listView, 55, 5, 60); 

     assertFalse(endlessScrollListener.isLoading()); 


     verify(endlessScrollListener, atMost(6)).hasMoreDataToLoad(); 
     verify(endlessScrollListener, times(1)).loadMoreData(1); 
     verify(endlessScrollListener, times(1)).loadMoreData(2); 
     verify(endlessScrollListener, never()).loadMoreData(3); 
    } 

    private static class TestEndlessScrollListener extends EndlessScrollListener { 

     private TestEndlessScrollListener(int visibleThreshold) { 
      super(visibleThreshold); 
     } 

     @Override 
     protected boolean hasMoreDataToLoad() { 
      return false; 
     } 

     @Override 
     protected void loadMoreData(int page) { 

     } 
    } 
} 

Các lỗi xảy ra trong các assertTrue đầu tiên:

assertTrue(endlessScrollListener.isLoading()); 

điều kỳ lạ nhất là theo stacktrace, nó sẽ xảy ra bên trong phương pháp assertTrue.

Đây là những maven phụ thuộc của tôi:

<dependencies> 
    <dependency> 
     <groupId>android</groupId> 
     <artifactId>android</artifactId> 
     <version>${android.version}</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.google.android</groupId> 
     <artifactId>support-v4</artifactId> 
     <version>${support.v4.version}</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.google.android</groupId> 
     <artifactId>support-v7-appcompat</artifactId> 
     <version>${support.v7.version}</version> 
     <scope>provided</scope> 
     <type>jar</type> 
    </dependency> 

    <dependency> 
     <groupId>org.robolectric</groupId> 
     <artifactId>robolectric</artifactId> 
     <version>${robolectric.version}</version> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.hamcrest</groupId> 
     <artifactId>hamcrest-core</artifactId> 
     <version>1.2</version> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.8.2</version> 
     <scope>test</scope> 
    </dependency> 
</dependencies> 

Như tôi đã nói, nó hoạt động bên trong IntelliJ.

Một chi tiết khác là tôi có một dự án khác tạo ra một JAR đang sử dụng Robolectric bình thường cả từ IntelliJ và từ Maven.

Bất kỳ ý tưởng nào về những gì đang xảy ra?

+1

chỉ là nhận xét nhỏ về các thử nghiệm của bạn - đó là quá nhiều xác nhận cho mỗi thử nghiệm. Số lượng các sự kiện cuộn hoặc tọa độ này có thay đổi nhiều không? Nếu không, tôi sẽ chỉ để lại một. Tôi cũng sẽ chia kiểm tra thành hai - một để kiểm tra đang tải nếu có dữ liệu, một trong số đó không tải nếu không có dữ liệu. –

+0

Cảm ơn lời khuyên của bạn. Tôi sẽ cố gắng cải thiện xét nghiệm này sớm. –

Trả lời

24

Vâng, vấn đề của tôi đã được rằng tôi đã nhập khẩu từ các gói sai:

import static junit.framework.Assert.assertFalse; 
import static junit.framework.Assert.assertTrue; 

tôi đã thay đổi nó để:

import static org.junit.Assert.assertFalse; 
import static org.junit.Assert.assertTrue; 

Bây giờ là làm việc như mong đợi. Tôi không biết tại sao nó lại hoạt động trong IntelliJ.

+1

Fernando, hãy thử thư viện 'fest-assert' để xác nhận. Nó là khá gây nghiện và mở rộng khả năng xác nhận và khả năng đọc được –

+0

Tôi bắt đầu sử dụng nó. Trên thực tế, tôi chỉ sử dụng fest-android. Tôi phải quen với việc sử dụng liên hoan. Cảm ơn bạn đã nhớ. –

5

Đó là phụ thuộc ngớ ngẩn nhưng di chuyển của junit và đặt nó trước khi phụ thuộc Android sẽ giải quyết vấn đề của bạn. Vì vậy, maven của bạn nên được như thế này:

depndencies 
-junit 
-android 
+0

Cảm ơn câu trả lời của bạn, nhưng đó không phải là vấn đề của tôi. Tôi đã sửa nó và tôi sẽ đăng câu trả lời ngay bây giờ. –

0

Di chuyển phụ thuộc junit lên chuỗi trên thư viện được tham chiếu của bạn và nó sẽ hoạt động. xem here