ser*_*rat 9 unit-testing scala testability sbt specs2
我一直在开发一个命令行工具,它在某些输入上调用System.exit()(不想使用异常而不是).
我熟悉Java:如何测试调用System.exit()的方法?它是最优雅的方法.
不幸的是,它是不够纯,因为我不得不添加的依赖关系到系统的规则,JUnit的接口
System.exit在specs2中是否有任何常见的处理模式,这种模式比我目前使用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"});
}
}
Run Code Online (Sandbox Code Playgroud)
Ven*_*Ven 10
如果你真的希望使用一个方法System.exit(),最简单的测试方法实际上就是调用它来替换你在调用时SecurityManager抛出ExitException(子类SecurityException)的System.exit()方法:
class 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)
}
Run Code Online (Sandbox Code Playgroud)
测试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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2125 次 |
| 最近记录: |