Avoid adding spy to list in DataSourceContractTests

After the fix in https://github.com/mockito/mockito/issues/2331, the calls to
equals on the fake transfer listener (due to its use in a list of listeners)
are treated as interactions with it, meaning that the current verification of
'no more interactions' will fail.

This change makes the transfer listener used for testing count bytes then
delegate to another (mock) transfer listener that's passed in to avoid the
problem.

PiperOrigin-RevId: 391949619
This commit is contained in:
andrewlewis 2021-08-20 10:34:51 +01:00 committed by bachinger
parent 0848188a43
commit 557a1833f7

View File

@ -24,7 +24,6 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
@ -391,8 +390,10 @@ public abstract class DataSourceContractTest {
for (int i = 0; i < resources.size(); i++) {
additionalFailureInfo.setInfo(getFailureLabel(resources, i));
DataSource dataSource = createDataSource();
FakeTransferListener listener = spy(new FakeTransferListener());
dataSource.addTransferListener(listener);
TransferListener listener = mock(TransferListener.class);
ByteCountingTransferListener byteCountingTransferListener =
new ByteCountingTransferListener(listener);
dataSource.addTransferListener(byteCountingTransferListener);
InOrder inOrder = Mockito.inOrder(listener);
@Nullable DataSource callbackSource = getTransferListenerDataSource();
if (callbackSource == null) {
@ -430,7 +431,8 @@ public abstract class DataSourceContractTest {
}
// Verify sufficient onBytesTransferred() callbacks have been triggered before closing the
// DataSource.
assertThat(listener.bytesTransferred).isAtLeast(resource.getExpectedBytes().length);
assertThat(byteCountingTransferListener.bytesTransferred)
.isAtLeast(resource.getExpectedBytes().length);
} finally {
dataSource.close();
@ -615,23 +617,37 @@ public abstract class DataSourceContractTest {
}
}
/** A {@link TransferListener} that only keeps track of the transferred bytes. */
public static class FakeTransferListener implements TransferListener {
/** A {@link TransferListener} that keeps track of the transferred bytes. */
private static final class ByteCountingTransferListener implements TransferListener {
private final TransferListener transferListener;
private int bytesTransferred;
@Override
public void onTransferInitializing(DataSource source, DataSpec dataSpec, boolean isNetwork) {}
public ByteCountingTransferListener(TransferListener transferListener) {
this.transferListener = transferListener;
}
@Override
public void onTransferStart(DataSource source, DataSpec dataSpec, boolean isNetwork) {}
public void onTransferInitializing(DataSource source, DataSpec dataSpec, boolean isNetwork) {
transferListener.onTransferInitializing(source, dataSpec, isNetwork);
}
@Override
public void onTransferStart(DataSource source, DataSpec dataSpec, boolean isNetwork) {
transferListener.onTransferStart(source, dataSpec, isNetwork);
}
@Override
public void onBytesTransferred(
DataSource source, DataSpec dataSpec, boolean isNetwork, int bytesTransferred) {
transferListener.onBytesTransferred(source, dataSpec, isNetwork, bytesTransferred);
this.bytesTransferred += bytesTransferred;
}
@Override
public void onTransferEnd(DataSource source, DataSpec dataSpec, boolean isNetwork) {}
public void onTransferEnd(DataSource source, DataSpec dataSpec, boolean isNetwork) {
transferListener.onTransferEnd(source, dataSpec, isNetwork);
}
}
}