Android上的简单测试Mockito失败了

时间:2015-07-06 13:29:50

标签: android mockito junit4

有谁可以告诉我为什么这个测试失败和/或如何让测试运行?

测试正确运行,直到最后一次断言。

@RunWith(MockitoJUnitRunner.class)
public class AccountHelpTest {

    @Mock
    AccountManager accountManager;

    public class AccountHelp {
        public AccountManager accountManager;
        public Account[] getAccounts(String type) {
            return accountManager.getAccountsByType(type);
        }
    }

    @Test
    public void account() {
        AccountHelp ah = new AccountHelp();
        ah.accountManager = accountManager;

        when(accountManager.getAccountsByType(anyString())).thenReturn(new Account[]{new Account("name", "type")});

        Account[] types = ah.getAccounts("type");

        Assert.assertNotNull(types);

        Assert.assertEquals(1, types.length);

        Assert.assertEquals("name", types[0].name);
    }
}

我可以将其分解为这个问题:

Account account = new Account("name", "test");
Assert.assertEquals("name", account.name);

这是失败的! (它是一个JUnit4测试,而不是一个instrumentationTest)

2 个答案:

答案 0 :(得分:0)

它将Android Studio provides a special android.jar用于测试,这使Mockito能够正常工作。 这个jar中的所有类都是某种虚拟类,这就是测试失败的原因。

作为一种解决方案(取决于您要测试的内容),您可以创建自己想要使用的类的实现。在我的课堂上,它会是这样的:

package android.accounts;

public class Account {
    public final String type;
    public final String name;

    public Account(String name, String type) {
        this.name = name;
        this.type = type;
    }
}

创建并再次执行测试后,测试成功。

答案 1 :(得分:0)

正如Unicate所说,Android Studio提供了一个android.jar,其中所有方法都是存根。 Robolectric通过生成替代Android内置ins的工作模拟类来解决这个问题。他们将ShadowAccountManager替换为AccountManager

就个人而言,我发现新版本的文档令人沮丧,但也许你会比我更好运。