robolelectric 3.0 Mockito——如何模拟课堂内部活动



我正在迁移到robot electric 3.0

问题陈述——

我有一个类appltility,它在MyActivity中被实例化,所以为了检查它的方法是否被调用,我需要在设置MyActivity之前在测试中模拟它。

下面是我的代码:
@Mock
private AppUtility mockAppUtility;
@Before
public void setUp() {
    initMocks(this);
    myActivity= Robolectric.setupActivity(MyActivity.class);
    equalsButton = (Button) myActivity.findViewById(R.id.equals_sign);
    shadowActivity = Shadows.shadowOf(myActivity);
}
下面是测试方法:——
  @Test
        public void shouldCallStartAlarm() {
            for (int i = 0; i < 4; i++) {
                equalsButton.performClick();
            }
            verify(mockAppUtility).startAlarm();
        }

但是我得到以下错误消息:——哪个show mock没有链接到活动,我怎么能把它绑定到活动?

Actually, there were zero interactions with this mock.

但是模拟对象不与测试相关联。在早期版本的robolelectric中,我将模拟对象与活动创建相关联,方法是重写它,如下所示

 myActivity = new MyActivity() {
                @Override
                AppUtility getUtil() {
                    return mockAppUtility;
                }
            };
            myActivity.onCreate(new Bundle());

和它使用工作良好,与Robolectric 3.0,我如何在开始活动之前绑定模拟对象。

@nenick之后是你的第二个选择:这是它的样子

    @Mock
    private AppUtility appUtility;
    @InjectMocks
    private MyActivity myActivity;
    @Before
    public void setUp() {
        ActivityController<MyActivity> activityController = Robolectric.buildActivity(MyActivity.class);
//      myActivity= Robolectric.setupActivity(MyActivity.class);
        myActivity=activityController.get();
        initMocks(this);
        activityController.setup();
        equalsButton = (Button) myActivity.findViewById(R.id.equals_sign);
//      shadowActivity = Shadows.shadowOf(calculatorActivity);
    }

,但我得到流动异常:-

java.lang.IllegalArgumentException: attempted to invoke public final android.app.Application org.robolectric.shadows.ShadowActivity.getApplication() on instance of class org.com.android.AppUtility$$EnhancerByMockitoWithCGLIB$$77c74666, but AppUtility$$EnhancerByMockitoWithCGLIB$$77c74666 doesn't extend ShadowActivity

在第一步——activityController.setup();

使用mockito模拟注入功能设置mock很容易。

@Mock
private AppUtility mockAppUtility;
@InjectMocks
Activity mActivity;
@Before
public void setUp() {
  myActivity= Robolectric.setupActivity(MyActivity.class);
  equalsButton = (Button) myActivity.findViewById(R.id.equals_sign);
  shadowActivity = Shadows.shadowOf(myActivity);
  // create and injects mocks into object annotated with @InjectMocks
  initMocks(this);
}

要在活动设置(onCreate,…)之前设置mock,您必须在设置之前访问您的活动。

@Before
public void setUp() {
  ActivityController<Activity> activityController = Robolectric.buildActivity(Activity.class);
  // get the activity instance 
  mActivity = activityController.get()
  initMocks(this);
  // now setup your activity after mock injection
  activityController.setup()
}

单元测试的主要规则之一——永远不要在测试下模拟类。你可以在上面加spy,但这是救援挑战,在这种情况下你不应该使用

另一个smell显示您有唤醒测试-当您能够成功运行此测试时,它将不能保证真正的警报设置。它将只保证调用了此方法。因此,最好验证set alrams而不是验证方法调用。查看此链接查看影子警报管理器

的示例使用

最新更新