使用Junit Rules简化你的测试用例

举报
张俭 发表于 2023/12/29 15:35:13 2023/12/29
【摘要】 我们从一个简单的例子开始,假设你想要为类中所有的测试方法设置时延。简单的方法就是这样:public class BlahTest { @Test(timeout = 1000) public void testA() throws Exception { //... } @Test(timeout = 1000) public void testB() throws ...

我们从一个简单的例子开始,假设你想要为类中所有的测试方法设置时延。简单的方法就是这样:

public class BlahTest {
  
  @Test(timeout = 1000)
  public void testA() throws Exception {
    //...
  }
  
  @Test(timeout = 1000)
  public void testB() throws Exception {
  }
  
  @Test(timeout = 1000)
  public void testC() throws Exception {
  }
  
  @Test(timeout = 1000)
  public void testD() throws Exception {
  }
  
  @Test(timeout = 1000)
  public void testE() throws Exception {
  }
}

这样子,你重复了很多次,如果你想要改变这个延迟,你需要在所有方法里面更改这个数字。使用Timeout Rule即可

public class BlashTest {
  @Rule
  public Timeout timeout = new Timeout(2000);
  
  @Test
  public void testA() throws Exception {
  }
  
  @Test
  public void testB() throws Exception {
  }
  
  @Test
  public void testC() throws Exception {
  }

  @Test
  public void testD() throws Exception {
  }
}

临时文件夹

public class BlahTest {
  @Rule
  public TemporaryFolder tempFolder = new TemporaryFolder();
  
  @Test
  public void testIcon() throws Exception {
    File icon = tempFolder.newFile("icon.png");
  }
 }

期望中的异常

public class BlahTest {
  @Rule
  public ExpectedException exception = ExpectedException.none();

  @Test
  public void testIcon() throws Exception {
    exception.expect(IllegalArgumentException.class);
    exception.expectMessage("Dude, this is invalid");
  }
}

你也可以自己实现TestRule接口,举个例子,初始化Mockito mocks的 Rule

@RequiredArgsConstructor
public class MockRule implements TestRule {
  private final Object target;
  
  public Statement apply(Statement base, Description description) {
    return new Statement() {
      @Override
      public void evaluate() throws Throwable {
        MockitoAnnotations.initMocks(target);
        base.evaluate();
      }
    };
  }
}

使用它,在你的类中声明

public class BlahTest {
  @Rule
  public MockRule mock = new MockRule(this);
  
  @Mock
  private BlahService service;

  @Test
  public void testBlash() throws Exception {
    Assert.assertThat(service.blah(), CoreMatchers.notNullValue());
  }
}

使用ClassRule的例子

public class MyServer extends ExternalResource {
  @Override
  protected void before() throws Throwable {
    //start the server
  }
  
  @Override
  public void after() {
    //stop the server
  }
}

使用ClassRule注册的时候,你的rule实例应该为静态。

public class BlahServerTest {
  @ClassRule
  public static MyServer server = new MyServer();
  
  @Test
  public void testBlah() throws Exception {
    //test sth that depends on the server
  }
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。