美文网首页
Junit5介绍

Junit5介绍

作者: engineer_tang | 来源:发表于2021-04-02 08:21 被阅读0次

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。

相关文章

网友评论

      本文标题:Junit5介绍

      本文链接:https://www.haomeiwen.com/subject/rkxtkltx.html