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 } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |