如何自动Mock

背景

单元测试中很多对象需要mock,每次都要写很多重复代码

解决

Mockito提供了@Mock注解,但需要其他操作配合注解

方案1 MockitoAnnotations

  @Before
  public void setUp() {
    MockitoAnnotations.initMocks(this);
  }

需要在@Before方法中初始化

方案2 MockitoJUnitRunner

 @RunWith(MockitoJUnitRunner.StrictStubs.class)
 public class ExampleTest {

     @Mock
     private List list;

     @Test
     public void shouldDoSomething() {
         list.add(100);
     }
 }

无法与其他Runner兼容,Runner只能有一个

方案3 MockitoSession

 public class ExampleTest {
     @Mock Foo foo;
     MockitoSession mockito;

     @Before public void setup() {
         mockito = Mockito.mockitoSession()
            .initMocks(this)
            .strictness(Strictness.STRICT_STUBS)
            .startMocking();
     }

     @After public void tearDown() {
         mockito.finishMocking();
     }
 }

@Before方法和@After方法需要手动开启关闭,还需要一个全局变量

方案4 MockitoRule

 public class ExampleTest {
     @Rule public MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);

     @Mock
     private List list;

     @Test
     public void shouldDoSomething() {
         list.add(100);
     }
 }

声明一个全局变量即可

结论

MockitoRule最方便,不用写样板代码,也可以和其他Runner协同工作

posted @ 2021-07-05 00:02  yupenglei  阅读(181)  评论(0)    收藏  举报