java getapplicationcontext_java – 如何模拟getApplicationContext

由于方法getApplicationContext在您要扩展的类内,所以有些问题.有几个问题需要考虑:

>你真的不能模拟一个被测试的类,这是对象继承(即子类化)的许多缺点之一.

>另一个问题是ApplicationContext是一个singleton,这使得它更加邪恶的测试,因为你不能轻易地嘲笑一个被编程为不可替代的全球状态.

在这种情况下你可以做的就是喜欢object composition over inheritance.所以为了让你的Activity可以测试,你需要分开一些逻辑.让我们说你的Activity被称为MyActivity.它需要由逻辑组件(或类)组成,让它命名为MyActivityLogic.这是一个简单的类图:

为了解决单例问题,我们让逻辑被“注入”一个应用程序的上下文,所以它可以用模拟测试.然后,我们只需要测试MyActivity对象将正确的应用程序上下文放入MyActivityLogic中.基本上解决这两个问题的方法是通过another layer of abstraction(Butler Lampson改写).在这种情况下,我们添加的新层是活动逻辑移动到活动对象之外.

为了你的例子,类需要看起来像这样:

public final class MyActivityLogic {

private MyApp mMyApp;

public MyActivityLogic(MyApp pMyApp) {

mMyApp = pMyApp;

}

public MyApp getMyApp() {

return mMyApp;

}

public void onClick(View pView) {

getMyApp().setNewState();

}

}

public final class MyActivity extends Activity {

// The activity logic is in mLogic

private final MyActivityLogic mLogic;

// Logic is created in constructor

public MyActivity() {

super();

mLogic = new MyActivityLogic(

(MyApp) getApplicationContext());

}

// Getter, you could make a setter as well, but I leave

// that as an exercise for you

public MyActivityLogic getMyActivityLogic() {

return mLogic;

}

// The method to be tested

public void onClick(View pView) {

mLogic.onClick(pView);

}

// Surely you have other code here...

}

应该看起来像这样:

为了测试MyActivityLogic,您只需要一个简单的jUnit TestCase而不是ActivityUnitTestCase(因为它不是一个Activity),你可以使用你的嘲弄框架来嘲笑你的应用程序上下文(因为手工自己的mocks是一个拖动).示例使用Mockito:

MyActivityLogic mLogic; // The CUT, Component Under Test

MyApplication mMyApplication; // Will be mocked

protected void setUp() {

// Create the mock using mockito.

mMyApplication = mock(MyApplication.class);

// "Inject" the mock into the CUT

mLogic = new MyActivityLogic(mMyApplication);

}

public void testOnClickShouldSetNewStateOnAppContext() {

// Test composed of the three A's

// ARRANGE: Most stuff is already done in setUp

// ACT: Do the test by calling the logic

mLogic.onClick(null);

// ASSERT: Make sure the application.setNewState is called

verify(mMyApplication).setNewState();

}

为了测试MyActivity,您一般使用ActivityUnitTestCase,我们只需要确保它创建一个具有正确ApplicationContext的MyActivityLogic.所有这一切的粗略测试代码示例:

// ARRANGE:

MyActivity vMyActivity = getActivity();

MyApp expectedAppContext = vMyActivity.getApplicationContext();

// ACT:

// No need to "act" much since MyActivityLogic object is created in the

// constructor of the activity

MyActivityLogic vLogic = vMyActivity.getMyActivityLogic();

// ASSERT: Make sure the same ApplicationContext singleton is inside

// the MyActivityLogic object

MyApp actualAppContext = vLogic.getMyApp();

assertSame(expectedAppContext, actualAppContext);

希望这一切都对您有帮助,并帮助您.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值