/*
 * Copyright (c) 2007 Mockito contributors
 * This program is made available under the terms of the MIT License.
 */
package org.mockito.exceptions;

@Deprecated
/**
 * @Deprecated. This class has been moved to internal packages because it was never meant to be public.
 * If you need it for extending Mockito please let us know. You can still use {@link org.mockito.internal.reporting.Discrepancy}.
 * However, the package clearly states that the class in a part of a public API so it can change.
 */
public class Discrepancy extends org.mockito.internal.reporting.Discrepancy {
    public Discrepancy(int wantedCount, int actualCount) {
        super(wantedCount, actualCount);
    }
}