簡體   English   中英

獲取java.lang.RuntimeException:通過Maven運行Robolectric時存根

[英]Getting java.lang.RuntimeException: Stub when running Robolectric through Maven

好吧,我有一個奇怪的錯誤。 當我通過IntelliJ運行我的測試時,它沒有任何問題。 但是如果我使用sure-fire插件或'mvn clean test'命令運行它,我會得到以下異常:

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)

這是我的測試:

@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) {

        }
    }
}

錯誤發生在第一個assertTrue中:

assertTrue(endlessScrollListener.isLoading());

最奇怪的是,根據stacktrace,它發生在assertTrue方法中。

這些是我的maven依賴項:

<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>

正如我所說,它在IntelliJ內部工作。

另一個細節是我有另一個項目生成一個JAR,它通常使用來自IntelliJ和Maven的Robolectric。

知道發生了什么事嗎?

好吧,我的問題是我從錯誤的包導入:

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

我改成了:

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

現在它按預期工作了。 我不知道為什么它在IntelliJ中工作。

這是愚蠢但移動junit的依賴,並把它放在Android依賴之前將解決你的問題。 所以你的maven應該是這樣的:

depndencies
-junit
-android

將junit依賴項移動到引用庫上的鏈中,它將起作用。 看到這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM