【问题标题】:Unable to Inject Mock Object - ActivityUnitTestCase无法注入模拟对象 - ActivityUnitTestCase
【发布时间】:2013-08-14 11:31:41
【问题描述】:

我一直在尝试使用 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()));

}
}

Vars 是一个将一些默认变量传递给 CalcActivity 的类。

我的问题是,变量 mockVar 从未使用过。来自 CalcActivity 的所有调用都转到最初存在于 CalcActivty 中的 Vars 类。

谁能指出我在 mockVar 注入方面做错了什么?

【问题讨论】:

  • 仅供参考,关于 ActivityUnitTestCase 的文档说永远不要在 setup 中调用 startActivity。您应该在测试方法本身中调用它。

标签: android mockito activityunittestcase


【解决方案1】:
  • 我想你错过了-

    @InjectMocks private CalcActivity mActivity;

  • 您是否使用“new”来创建 Vars 的新对象?不确定,但我认为应该有一些 setter 注入,例如 [需要专家在此处提供建议] -

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

然后使用这个方法注入你的模拟对象。

mActivity.setVars(mockVar);
  • 然后在你存根之后调用该方法 -

    mActivity.callYourMethodWhichYouAreTesting();

【讨论】:

  • @InjectMocks 将如何提供帮助?您将创建一个CalcActivity,注入模拟,然后将mActivity 分配给其他东西。您的其余答案有些道理,但要知道如何最好地将mockVar 注入被测系统,我们真的需要更多地了解IntentCalcActivity 内部发生的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 2012-03-16
  • 2017-10-11
  • 1970-01-01
相关资源
最近更新 更多