加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala:如何测试调用System.exit()的方法?

发布时间:2020-12-16 08:53:06 所属栏目:安全 来源:网络整理
导读:我一直在开发一个命令行工具,它在某些输入上调用System.exit()(不想使用异常而不是). 我熟悉Java: How to test methods that call System.exit()?及其最优雅的approach. 不幸的是,它不够纯,因为我不得不将依赖项添加到system-rules,junit-interface 是否有任
我一直在开发一个命令行工具,它在某些输入上调用System.exit()(不想使用异常而不是).

我熟悉Java: How to test methods that call System.exit()?及其最优雅的approach.

不幸的是,它不够纯,因为我不得不将依赖项添加到system-rules,junit-interface

是否有任何常见的模式来处理specs2中的System.exit,它比我目前使用specs2的方法更纯粹?

import org.junit.Rule;
import org.junit.Test;
import org.junit.contrib.java.lang.system.ExpectedSystemExit;

public class ConverterTest {
    @Rule
    public final ExpectedSystemExit exit = ExpectedSystemExit.none();

    @Test
    public void emptyArgs() {
        exit.expectSystemExit();
        Converter.main(new String[]{});
    }

    @Test
    public void missingOutArgument() {
        exit.expectSystemExitWithStatus(1);
        Converter.main(new String[]{"--in","src/test/resources/078.xml.gz"});
    }
}

解决方法

如果你真的希望使用一个使用System.exit()的方法,那么实际调用它的最简单方法是将一个在调用System.exit()时抛出一个ExitException(子类化SecurityException)的SecurityManager替换它. :

类SystemExitSpec

import java.security.Permission

import org.specs2.mutable.Specification
import org.specs2.specification.BeforeAfterAll

sealed case class ExitException(status: Int) extends SecurityException("System.exit() is not allowed") {
}

sealed class NoExitSecurityManager extends SecurityManager {
  override def checkPermission(perm: Permission): Unit = {}

  override def checkPermission(perm: Permission,context: Object): Unit = {}

  override def checkExit(status: Int): Unit = {
    super.checkExit(status)
    throw ExitException(status)
  }
}


abstract class SystemExitSpec extends Specification with BeforeAfterAll {

  sequential

  override def beforeAll(): Unit = System.setSecurityManager(new NoExitSecurityManager())

  override def afterAll(): Unit = System.setSecurityManager(null)
}

测试ConverterSpec

import org.specs2.execute.Failure

import scala.io.Source

class ConverterSpec extends SystemExitSpec {

"ConverterSpec" should {

    "empty args" >> {
      try {
        Converter.main(Array[String]())
        Failure("shouldn't read this code")
      } catch {
        case e: ExitException =>
          e.status must_== 1
      }
      1 must_== 1
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读