org.mockito.junit.MockitoRule Maven / Gradle / Ivy
Show all versions of mockito-core Show documentation
/*
* Copyright (c) 2016 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockito.junit;
import org.junit.rules.MethodRule;
import org.mockito.MockSettings;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.MockitoSession;
import org.mockito.exceptions.misusing.PotentialStubbingProblem;
import org.mockito.quality.MockitoHint;
import org.mockito.quality.Strictness;
/**
* Mockito JUnit Rule helps keeping tests clean.
* It initializes mocks, validates usage and detects incorrect stubbing.
* Make sure to configure your rule with {@link #strictness(Strictness)} which automatically
* detects stubbing argument mismatches and is planned to be the default in Mockito v3.
*
* Since Mockito 2.1.0, JUnit rule emits stubbing warnings and hints to System output (see {@link MockitoHint}).
* The JUnit rule can be used instead of {@link MockitoJUnitRunner}.
* It requires JUnit at least 4.7.
*
* The rule adds following behavior:
*
* -
* Since 2.1.0, stubbing warnings and hints are printed to System output.
* Hints contain clickable links that take you right to the line of code that contains a possible problem.
* Please give us feedback about the stubbing warnings of JUnit rules in the issue tracker
* (issue 384).
* It's a new feature of Mockito 2.1.0. It aims to help debugging tests.
* If you wish the previous behavior, see {@link MockitoRule#silent()}.
* However, we would really like to know why do you wish to silence the warnings!
* See also {@link MockitoHint}.
*
-
* Initializes mocks annotated with {@link org.mockito.Mock},
* so that explicit usage of {@link MockitoAnnotations#openMocks(Object)} is not necessary.
* Mocks are initialized before each test method.
*
-
* Validates framework usage after each test method. See javadoc for {@link org.mockito.Mockito#validateMockitoUsage()}.
*
-
* It is highly recommended to use the rule with {@link #strictness(Strictness)} configured to {@link Strictness#STRICT_STUBS}.
* It drives cleaner tests and improves debugging experience.
* The only reason this feature is not turned on by default
* is because it would have been an incompatible change
* and Mockito strictly follows semantic versioning.
*
*
* Example use:
*
* public class ExampleTest {
*
* //Creating new rule with recommended Strictness setting
* @Rule public MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
*
* @Mock
* private List list;
*
* @Test
* public void shouldDoSomething() {
* list.add(100);
* }
* }
*
*
* If you would like to take advantage of Mockito JUnit rule features
* but you cannot use the rule there is a solution!
* {@link MockitoSession} API is intended to offer cleaner tests and improved debuggability
* to users that cannot use Mockito's built-in JUnit support (runner or the rule).
*
* @since 1.10.17
*/
public interface MockitoRule extends MethodRule {
/**
* Rule will not report stubbing warnings during test execution.
* By default, stubbing warnings are printed to Standard output to help debugging.
* Equivalent of configuring {@link #strictness(Strictness)} with {@link Strictness#LENIENT}.
*
* Please give us feedback about the stubbing warnings of JUnit rules
* by commenting on GitHub issue 769.
* It's a new feature of Mockito 2.1.0. It aims to help debugging tests.
* We want to make sure the feature is useful.
* We would really like to know why do you wish to silence the warnings!
* See also {@link MockitoHint}.
*
*
* Example:
*
* public class ExampleTest {
*
* @Rule
* public MockitoRule rule = MockitoJUnit.rule().silent();
*
* }
*
*
* @since 2.1.0
*/
MockitoRule silent();
/**
* The strictness, especially "strict stubs" ({@link Strictness#STRICT_STUBS})
* helps debugging and keeping tests clean.
* It's a new feature introduced in Mockito 2.3.
* Other levels of strictness - "warn" - ({@link Strictness#WARN})
* and "lenient" ({@link MockitoRule#silent()}) strictness were already present in Mockito 2.1.0.
* Version 2.3.0 introduces "strict stubs" ({@link Strictness#STRICT_STUBS}).
*
*
* public class ExampleTest {
* @Rule
* public MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
* }
*
*
* See Javadoc for {@link Strictness} to learn how strictness influences the behavior of the JUnit rule.
* See {@link Strictness#STRICT_STUBS} to learn why is it recommended to use "strict stubbing".
*
* It is possible to tweak the strictness per test method.
* Why would you need it? See the use cases in Javadoc for {@link PotentialStubbingProblem} class.
* In order to tweak strictness per stubbing see {@link Mockito#lenient()}, per mock see {@link MockSettings#lenient()}.
*
*
* public class ExampleTest {
* @Rule
* public MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
*
* @Test public void exampleTest() {
* //Change the strictness level only for this test method
* //Useful for edge cases (see Javadoc for PotentialStubbingProblem class)
* mockito.strictness(Strictness.LENIENT);
*
* //remaining test code
* }
* }
*
*
* "Strict stubs" are planned to be the default for Mockito v3
* We are very eager to hear feedback about "strict stubbing" feature, let us know by commenting on GitHub
* issue 769.
* Strict stubbing is an attempt to improve testability and productivity with Mockito. Tell us what you think!
*
* @since 2.3.0
*/
MockitoRule strictness(Strictness strictness);
}