我读了this很棒的帖子。该帖子中的侦听器由用户创建,然后设置为对象。所以我们可以模拟监听器然后验证时间来检查它是否被调用。
但是我的情况下,侦听器是在对象中创建的私有对象,我们有 api 来获取侦听器,但没有 api 来设置侦听器。
对这个私人监听器进行单元测试的正确方法是什么:
代码示例:
class EventMonitor {
public interface IEventListener {
void onFirst(int value);
void onSecond(int value1,int value2);
};
private IEventListener mEventListener = new IEventListener() {
@Override
public void onFirst(int value) {
//dofirst
}
@Override
public void onSecond(int value1, int value2) {
//doSecond
}
};
public IEventListener getEventListener(IEventListener listener) {
return mEventListener;
}
public void doStuff() {
mEventListener.onFirst(0);
mEventListener.onSecond(1,1);
}
}
如何验证
onFirst
和onSecond
已被调用?
最简单的方法是让你的
private
听众 VisibleForTesting
:
@VisibleForTesting
public IEventListener mEventListener = new IEventListener() {
@Override
public void onFirst(int value) {
//dofirst
}
@Override
public void onSecond(int value1, int value2) {
//doSecond
}
};
然后在你的测试中做同样的事情,
mEventListener
在unitTest代码中是公开的,没有警告:
class ExampleUnitTest {
@Mock
lateinit var listener: EventMonitor.IEventListener
@InjectMocks
private val monitor = EventMonitor()
@Before
fun initMocks() {
MockitoAnnotations.openMocks(this)
monitor.mEventListener = listener
}
@Test
fun addition_isCorrect() {
monitor.doStuff()
verify(listener, times(1)).onFirst(0)
}
}
如果您尝试从主代码访问
mEventListener
,将会出现警告。但它仍然构建成功,所以它不是 100% 私有