1. ExtendWith注解
所属包为org.junit.jupiter.api.extension,@ExtendWith是一个可重复的注释,用于为带注释的测试类或测试方法注册扩展。
2. MockitoExtension类
初始化mock和处理严格存根的扩展。这个扩展是JUnit Jupiter等价于我们的JUnit4 MockitoJUnitRunner。用法示例:
@ExtendWith(MockitoExtension.class)
public class ExampleTest {
@Mock
private List<Integer> list;
@Test
public void shouldDoSomething() {
list.add(100);
}
}
如果要为测试类配置使用的严格性,请使用MockitoSettings。
@MockitoSettings(strictness = Strictness.STRICT_STUBS)
public class ExampleTest {
@Mock
private List<Integer> list;
@Test
public void shouldDoSomething() {
list.add(100);
}
}
这个扩展还支持JUnit Jupiter的方法参数。使用仅在特定测试方法中使用的模拟初始化参数。换句话说,你在Junit4中初始化本地mocks 可以通过调用Mockito.mock(Class)。来使用方法参数。这在用泛型初始化mock时尤其有用,因为您不再收到关于“未检查的赋值”的警告。请参阅junitjupiter的文档以了解方法参数何时有用。
@ExtendWith(MockitoExtension.class)
public class ExampleTest {
@Mock
private List<Integer> sharedList;
@Test
public void shouldDoSomething() {
sharedList.add(100);
}
@Test
public void hasLocalMockInThisTest(@Mock List<Integer> localList) {
localList.add(100);
sharedList.add(100);
}
}
最后,扩展支持JUnitJupiter的构造函数参数。这允许您在构造函数中执行安装工作,并将字段设置为final。请参阅JUnitJupiter的文档,了解构造函数参数何时有用。
@ExtendWith(MockitoExtension.class)
public class ExampleTest {
private final List<Integer> sharedList;
ExampleTest(@Mock sharedList) {
this.sharedList = sharedList;
}
@Test
public void shouldDoSomething() {
sharedList.add(100);
}
}
3. Mock注解
把一个属性标记为mock模拟对象。
允许使用简略的方式进行mock模拟创建。
最小化重复的模拟创建代码。
使测试类更具可读性。
使验证错误更易于读取,因为字段名用于标识模拟。
自动检测MockedStatic类型的静态模拟,并推断type参数的静态模拟类型。
public class ArticleManagerTest extends SampleBaseTestCase {
@Mock private ArticleCalculator calculator;
@Mock(name = "database") private ArticleDatabase dbMock;
@Mock(answer = RETURNS_MOCKS) private UserProvider userProvider;
@Mock(extraInterfaces = {Queue.class, Observer.class}) private articleMonitor;
@Mock(stubOnly = true) private Logger logger;
private ArticleManager manager;
@Before public void setup() {
manager = new ArticleManager(userProvider, database, calculator, articleMonitor, logger);
}
}
public class SampleBaseTestCase {
private AutoCloseable closeable;
@Before public void openMocks() {
closeable = MockitoAnnotations.openMocks(this);
}
@After public void releaseMocks() throws Exception {
closeable.close();
}
}
MockitoAnnotations.openMocks(this) 方法必须被调用以初始化带注释的对象。在上面的示例中,openMocks()是在测试基类的@Before(JUnit4)方法中调用的。对于JUnit3,openMocks()可以转到基类的setup() 方法。相反,您也可以将openMocks()放入JUnit运行程序(@RunWith)或使用内置的MockitoJUnitRunner。另外,确保在用相应的钩子处理测试类之后释放所有mock。
网友评论