Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 无法注入模拟对象-ActivityUnitTestCase_Android_Mockito_Activityunittestcase - Fatal编程技术网

Android 无法注入模拟对象-ActivityUnitTestCase

Android 无法注入模拟对象-ActivityUnitTestCase,android,mockito,activityunittestcase,Android,Mockito,Activityunittestcase,我一直在尝试使用Mockito测试一个示例应用程序 我的测试用例: public class CalcActivityTest extends ActivityUnitTestCase<CalcActivity> { private Intent in; private Button btnAdd,btnSub,btnMul,btnDiv,btnDef; private TextView res; private CalcActivity mActivity; @Mock priv

我一直在尝试使用Mockito测试一个示例应用程序

我的测试用例:

public class CalcActivityTest extends ActivityUnitTestCase<CalcActivity> {

private Intent in;
private Button btnAdd,btnSub,btnMul,btnDiv,btnDef;
private TextView res;
private CalcActivity mActivity;
@Mock
private Vars mockVar;


public CalcActivityTest() {
    super(CalcActivity.class);
}

@Before
protected void setUp() throws Exception{

    super.setUp();

    MockitoAnnotations.initMocks(this);

    when(mockVar.getn1()).thenReturn(20.0);
    when(mockVar.getn2()).thenReturn(40.0);

    in = new Intent(getInstrumentation().getTargetContext(),CalcActivity.class);
    in.putExtra("num1", 20.0);
    in.putExtra("num2",20.0);
    startActivity(in, null, null);
}
@UiThreadTest
public void testOperations(){

    mActivity = getActivity();

    btnAdd = (Button) mActivity.findViewById(com.example.advancedcalc.R.id.add);
    btnSub = (Button) mActivity.findViewById(com.example.advancedcalc.R.id.sub);
    btnMul = (Button) mActivity.findViewById(com.example.advancedcalc.R.id.mul);
    btnDiv = (Button) mActivity.findViewById(com.example.advancedcalc.R.id.div);

    btnDef = (Button) mActivity.findViewById(com.example.advancedcalc.R.id.btnDef);
    res = (TextView) mActivity.findViewById(com.example.advancedcalc.R.id.res);
    btnAdd.performClick();

    assertEquals(40.0 , Double.parseDouble(res.getText().toString()));

    btnSub.performClick();
    assertEquals(0.0 , Double.parseDouble(res.getText().toString()));

    btnMul.performClick();
    assertEquals(400.0, Double.parseDouble(res.getText().toString()));

    btnDiv.performClick();
    assertEquals(1.0 , Double.parseDouble(res.getText().toString()));

    btnDef.performClick();
    btnAdd.performClick();
    assertEquals(1000 , Double.parseDouble(res.getText().toString()));

}
}
公共类CalActivityTest扩展了ActivityUnitTestCase{
私人意图;
专用按钮btnAdd、btnSub、btnMul、btnDiv、btnDef;
私有文本视图资源;
私人活动;
@嘲弄
私有变量mockVar;
公共活动测试(){
超级(calactivity.class);
}
@以前
受保护的void setUp()引发异常{
super.setUp();
initMocks(this);
when(mockVar.getn1())。然后返回(20.0);
when(mockVar.getn2()).thenReturn(40.0);
in=新意图(getInstrumentation().getTargetContext(),calActivity.class);
in.putExtra(“num1”,20.0);
in.putExtra(“num2”,20.0);
startActivity(in、null、null);
}
@超线程测试
公共void testOperations(){
mActivity=getActivity();
btnAdd=(Button)mActivity.findviewbyd(com.example.advancedcalc.R.id.add);
btnSub=(Button)mActivity.findviewbyd(com.example.advancedcalc.R.id.sub);
btnMul=(Button)mActivity.findviewbyd(com.example.advancedcalc.R.id.mul);
btnDiv=(Button)mActivity.findviewbyd(com.example.advancedcalc.R.id.div);
btnDef=(按钮)mActivity.findviewbyd(com.example.advancedcalc.R.id.btnDef);
res=(TextView)mActivity.findviewbyd(com.example.advancedcalc.R.id.res);
btnAdd.performClick();
assertEquals(40.0,Double.parseDouble(res.getText().toString());
btnSub.performClick();
assertEquals(0.0,Double.parseDouble(res.getText().toString());
btnMul.performClick();
assertEquals(400.0,Double.parseDouble(res.getText().toString());
btnDiv.performClick();
assertEquals(1.0,Double.parseDouble(res.getText().toString());
btnDef.performClick();
btnAdd.performClick();
assertEquals(1000,Double.parseDouble(res.getText().toString());
}
}
Vars是一个将一些默认变量传递到CalActivity的类

我的问题是,永远不会使用mockVar变量。来自CalActivity的所有调用都会转到最初存在于CalActivity中的Vars类

有人能指出我在mockVar注射方面做错了什么吗?

  • 我想你错过了-

    @InjectMocks
    私人活动

  • 您是否使用“新建”来创建变量的新对象?不确定,但我认为应该有一些setter注射,比如[这里需要专家建议]-

    public void setVars(Vars-Vars){
    this.vars=vars;
    }

然后使用此方法注入模拟对象

mActivity.setVars(mockVar);
  • 然后在你把所有的东西都剪断后调用这个方法-

    mActivity.callyourMethodwhichyouaresting()


  • @InjectMocks
将如何提供帮助?您需要创建一个
calActivity
,注入mock,然后将
macActivity
分配给其他对象。剩下的答案有些道理,但要知道如何最好地将
mockVar
注入被测系统,我们真的需要更多地了解
Intent
calactivity
内部的情况。仅供参考,ActivityUnitTestCase上的文档说永远不要在设置内部调用startActivity。您应该在测试方法本身中调用它。