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?
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. –
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. –