使用PowerMockito的模拟静态方法将上下文作为参数



我有静态方法的类

public class GrandUtils {
 
    /**
     * Return list of existing user's emails
     *
     * @param c context of the app
     * @return list of existing accounts in system or empty list
     */
    public static Set<String> getAccountsList(Context c) {
        Set<String> accountsList = new HashSet<>();
        Pattern emailPattern = Patterns.EMAIL_ADDRESS; // API level 8+
        Account[] accounts = AccountManager.get(c).getAccounts();
        for (Account account : accounts) {
            if (emailPattern.matcher(account.name).matches()) {
                accountsList.add(account.name);
            }
        }
        return accountsList;
    }
}

此外,我已经实施了复杂的意图服务,该意见正在调用GrandUtils.getAccountList(Context c)并将此帐户保存到SharedPreferences。因此,我想用自己的一组电子邮件模拟方法,然后检查保存在SharedPreferences

中的结果

所以我写了这个测试

    @RunWith(MockitoJUnitRunner.class)
    @PrepareForTest(GrandUtils.class)
    public class CampaingTrackingTest extends ApplicationTestCase<Application> {
        
            public CampaingTrackingTest() {
                super(Application.class);
            }
        
            @Override
            @Before
            public void setUp() throws Exception {
                super.setUp();
                System.setProperty("dexmaker.dexcache", getContext().getCacheDir().getPath());
                createApplication();
            }
        
            @MediumTest
            public void testMockAccounts() {
                HashSet<String> mails = new HashSet<>();
                mails.add("one@one.com");
                //it needs Context
PowerMockito.when(GrandUtils.getAccountsList(getContext())).thenReturn(mails);
        
                Set<String> givenMails = GrandUtils.getAccountsList(getContext());
                assertNotNull(givenMails);
                assertEquals(givenMails.size(), 1);
        
                // Next part for comparing data with IntentService and SharedPreferences
            }
        }

,但它失败了

org.mockito.exceptions.misusing.missingmethodinvocation exception:当()需要一个必须是"模拟方法的方法"的参数。例如:何时(Mock.getArticles())。thenturn(文章);

另外,此错误可能出现是因为:

  1. 您存根以下是:final/private/equals()/hashcode()方法。这些方法不能被固定/验证。声明的模拟方法在非公共父母类中不支持。

  2. 内部()当()您不在模拟上调用方法,而是在某些其他对象上。

我敢肯定我做错了什么,但是什么?

请参阅静态方法的模拟示例Log.d(String tag, String message)

https://github.com/mttkay/droid-fu/blob/master/src/src/test/java/java/com/com/github/droidfu/testbase.java

我认为这为处理静态方法提供了一个很好的例子。

相关内容

  • 没有找到相关文章