gpt4 book ai didi

android - Mockito:不调用传递给方法的 Runnable 参数的 Runnable.run()

转载 作者:行者123 更新时间:2023-11-30 00:33:38 27 4
gpt4 key购买 nike

我正在使用 Mockito 进行测试。我有一个回调接口(interface):

interface Callback {
void onMessageRetrieved(String message);
void onRetrievalFailed(String error);
}

然后,我有一个方法接受调用该回调方法的 Runnable 对象:

首先,interactor.run() 调用这个调用 postMessage 的方法:

    @Override
public void run() {
final String message = mMessageRepository.getWelcomeMessage();
if (message == null || message.length() == 0) {
notifyError();
return;
}
postMessage(message);
}

private void postMessage(final String msg) {
mMainThread.post(new Runnable() {
@Override
public void run() {
mCallback.onMessageRetrieved(msg);
}
});
}

但是行 mCallback.onMessageRetrieved(msg); 从未被执行,所以我得到:

 Wanted but not invoked: callback.onMessageRetrieved(     "Welcome, friend!" );

Why is run() not executed?

I am working with the project from this articles. This is my Test class:

public class ExampleUnitTest {    
private MessageRepository mMessageRepository;
private Executor mExecutor;
private MainThreadImpl mMainThread;
private WelcomingInteractor.Callback mMockedCallback;

@Before
public void setUp() {
mMessageRepository = mock(MessageRepository.class);
mExecutor = mock(Executor.class);
mMainThread = mock(MainThreadImpl.class);
mMockedCallback = mock(WelcomingInteractor.Callback.class);
}

@Test
public void testWelcomeMessageFound() throws Exception {
String msg = "Welcome, friend!";
when(mMessageRepository.getWelcomeMessage()).thenReturn(msg);
WelcomingInteractorImpl interactor = new WelcomingInteractorImpl(
mExecutor,
mMainThread,
mMockedCallback,
mMessageRepository);
interactor.run();

Mockito.verify(mMessageRepository).getWelcomeMessage();
Mockito.verifyNoMoreInteractions(mMessageRepository);
Mockito.verify(mMockedCallback).onMessageRetrieved(msg);
}
}

最佳答案

这里:

mMainThread.post(new Runnable()

但是在你的单元测试中,你有:

mExecutor = mock(Executor.class);
mMainThread = mock(MainThreadImpl.class);

那个 post() 调用接收到一个 Runnable 对象。我假设您的 impl 类在某个线程中运行 Runnable.run()。

但是:在您的单元 测试中,您正在模拟 所有这些元素。

您必须了解:mMainThread = mock(MainThreadImpl.class); 不会创建真实 MainThreadImpl 对象。它返回一些看起来像那个类的对象;但这是一个模拟。它与您的实际实现完全分离。当你执行 mMainThread.poll() 时......什么都不会发生。 run 方法从不 执行。因为当您对其调用 poll() 时,模拟对象对该参数做任何事情。

换句话说:您必须配置您所有的模拟。例如,您可以使用 ArgumentCaptor 并捕获提供给 post() 方法的 Runnable 对象。

当然,因为这只是匿名内部类的一些实例,所以这不会有太大帮助。

长话短说:你应该退后一步;并做更多阅读如何/为什么使用模拟对象...

关于android - Mockito:不调用传递给方法的 Runnable 参数的 Runnable.run(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43798822/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com