如何在 Android 单元测试中调用侦听器接口

2022-09-04 19:38:33

我的Android应用程序中有以下(示例)结构,我正在尝试为其编写单元测试:

class EventMonitor {
  private IEventListener mEventListener;

  public void setEventListener(IEventListener listener) {
    mEventListener = listener;
  }

  public void doStuff(Object param) {
    // Some logic here
    mEventListener.doStuff1();
    // Some more logic
    if(param == condition) {
      mEventListener.doStuff2();
    }
  }
}

我想确保当我传递 的某些值时,调用正确的接口方法。我可以在标准 JUnit 框架中执行此操作,还是需要使用外部框架?这是我想要的单元测试的示例:param

public void testEvent1IsFired() {
  EventMonitor em = new EventMonitor();
  em.setEventListener(new IEventListener() {
    @Override
    public void doStuff1() {
      Assert.assertTrue(true);
    }

    @Override
    public void doStuff2() {
      Assert.assertTrue(false);
    }
  });
  em.doStuff("fireDoStuff1");
}

我也是Java的初学者,所以如果这不是一个用于测试目的的好模式,我愿意将其更改为更易于测试的模式。


答案 1

在这里,您要进行测试,并且在执行此方法时,您希望确保是否调用了 正确的方法。EventMonitor.doStuff(param)IEventListener

因此,为了进行测试,您不需要有一个真正的实现:您需要的只是一个模拟实现,并且您必须在测试时验证方法调用的确切数量。这可以通过Mockito或任何其他模拟框架来实现。doStuff(param)IEventListenerIEventListenerIEventListenerdoStuff

下面是Mockito的一个例子:

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

public class EventMonitorTest {

    //This will create a mock of IEventListener
    @Mock
    IEventListener eventListener;

    //This will inject the "eventListener" mock into your "EventMonitor" instance.
    @InjectMocks
    EventMonitor eventMonitor = new EventMonitor();

    @Before
    public void initMocks() {
        //This will initialize the annotated mocks
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void test() {
        eventMonitor.doStuff(param);
        //Here you can verify whether the methods "doStuff1" and "doStuff2" 
        //were executed while calling "eventMonitor.doStuff". 
        //With "times()" method, you can even verify how many times 
        //a particular method was invoked.
        verify(eventListener, times(1)).doStuff1();
        verify(eventListener, times(0)).doStuff2();
    }

}

答案 2

推荐