android单元测试私有监听器是否被调用

问题描述 投票:0回答:1

我读了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
已被调用?

android unit-testing
1个回答
0
投票

最简单的方法是让你的

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% 私有

© www.soinside.com 2019 - 2024. All rights reserved.