【问题标题】:Android Mockito java.lang.AssertionError:Android Mockito java.lang.AssertionError:
【发布时间】:2016-03-15 06:14:42
【问题描述】:

我刚开始使用 Mockito,所以我可以在我的 Android 应用程序上执行单元测试。我不明白为什么会出现以下错误:

谁能告诉我这里缺少什么?

java.lang.AssertionError: 
Expected :http://a/h/url
Actual   :null
  <Click to see difference>




at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.failNotEquals(Assert.java:834)
at org.junit.Assert.assertEquals(Assert.java:118)

测试类

@RunWith(MockitoJUnitRunner.class)
public class NewsItemWrapperTest {

    public static final String T_URL ="http://a/th/url";
    public static final String H_URL ="http://a/h/url";


    @Mock
    NewsItem newsItem;

    @Mock
    NewsItemWrapper newsItemWrapper;

    @Before
    public void setUp() throws Exception {
        //initMocks(this);
        newsItemWrapper = new NewsItemWrapper(newsItem);
    }

    @Test
    public void testGetThumbImageUrl() throws Exception {



        assertEquals(T_URL, newsItemWrapper.getThumbNailImage());
    }

    @Test
    public void testGetHeroImageUrl() throws Exception {
        assertEquals(H_URL, newsItemWrapper.getHImage());
    }
}

【问题讨论】:

  • 添加您的测试用例代码。我的意思是 NewsItemWrapperTest
  • 嗨@sankyjain 我添加了我的测试用例。感谢回复
  • 你在哪里嘲笑过 newsItem?请添加那部分。问题是 newsItemWrapper.getHImage() 返回 null。所以我们需要看看你是如何嘲笑的
  • 嗨 @sankyjain 我不确定你在哪里嘲笑 newsItem 是什么意思?
  • 这就是全部代码?如果是,您应该添加所有方法模拟。例如,您应该模拟 newsItem.getMediaList() 方法等等。

标签: android unit-testing junit mockito


【解决方案1】:

这只是一个例子。同样,您需要模拟所有方法。 您还可以模拟媒体对象。

Media m1 = new Media();
Media m2 = new Media();

List<Media> mediaList = Arrays.asList(m1, m2);
when(newsItem.getMediaList()).thenReturn(mediaList);

【讨论】:

  • 谢谢。我添加了这个,但我得到了 NullPointerException:@Before public void setUp() throws Exception { NewsItem.Media m1 = new NewsItem.Media(); NewsItem.Media m2 = 新 NewsItem.Media(); List mediaList = Arrays.asList(m1, m2); Mockito.when(newsItem.getMediaList()).thenReturn(mediaList); newsItemWrapper = new NewsItemWrapper(newsItem); }
  • 显然会返回 NullPointer 异常。这只是一个示例,您需要定义 Media 对象或模拟它,然后返回所有函数调用。我会建议你通过一个 mockito 教程,看看它是如何工作的
【解决方案2】:

您的NewsItem newsItem; 是一个模拟。它基本上什么都不做。 void 方法什么都不做。其他方法将返回 null(或适当的默认原始值)。因此,在您的情况下,对 newsItem.getMediaList() 的调用将返回 null。

要改变这一点,你必须告诉你的模拟它应该做一些事情,最好是在@Before 方法中,例如......

List<NewsItem.Media> mediaList = new ArrayList<>();
...put stuff in it
Mockito.when( newsItem.getMediaList() ).thenReturn( mediaList );

这告诉你的模拟:“当你(newsItem)调用getMediaList()方法时,返回这个列表。”。你也可以告诉你的 mock 抛出一个异常(例如测试错误处理)等等。

记住:这是模拟的工作,允许您模拟一种行为。没有命令来模拟某些东西,mock 什么也不做。 Mocks 允许您轻松地为依赖项创建假对象(在这种情况下,您的代码依赖于 NewsItem 并且使用 mock 可以让您拥有一个 NewsItem ,它的行为将完全符合您的测试情况,无论是正确或有某种错误)。

【讨论】:

  • 感谢@Florian Shaetz,我添加了这个但仍然无法正常工作:@Before public void setUp() throws Exception { List mediaList = new ArrayList(); Mockito.when(newsItem.getMediaList()).thenReturn(mediaList); newsItemWrapper = new NewsItemWrapper(newsItem); }
  • 您的 mediaList 显然也必须包含项目。向其中添加内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多