如何为含try-catch的方法编写Spock异常处理测试用例?
Spock测试Java异常分支的正确写法
你没法在单个测试用例里同时覆盖try和catch分支,因为这两个分支是互斥的——一次方法调用只会触发其中一个逻辑。正确的做法是写两个独立的测试用例,分别覆盖正常分支和异常分支。
1. 覆盖try分支的测试用例
这个用例验证当SecureRandom.getInstanceStrong()正常返回时,方法直接返回该实例:
def "genRand返回getInstanceStrong生成的实例"() { given: ClassName mockClassName = spy(ClassName) mockClassName.logger >> mockLogger // 确保mockLogger已提前定义 when: Random result = mockClassName.genRand() then: 1 * SecureRandom.getInstanceStrong() // 验证静态方法被调用一次 result instanceof SecureRandom }
2. 覆盖catch分支的测试用例
这里的核心是要让静态方法SecureRandom.getInstanceStrong()抛出NoSuchAlgorithmException,因为是静态方法,需要用Spock的全局mock来拦截调用:
def "genRand在getInstanceStrong失败时返回新的SecureRandom实例"() { given: ClassName mockClassName = spy(ClassName) mockClassName.logger >> mockLogger // 全局mock SecureRandom类,拦截静态方法调用 GroovyMock(SecureRandom, global: true) SecureRandom.getInstanceStrong() >> new NoSuchAlgorithmException("测试异常") when: Random result = mockClassName.genRand() then: 1 * mockLogger.debug("测试异常") // 验证日志方法被调用 result instanceof SecureRandom 1 * new SecureRandom() // 验证构造方法被调用 }
你之前的第二个测试用例错误原因
你之前的写法没有正确mock静态方法SecureRandom.getInstanceStrong()。普通的spy只能mock实例方法,静态方法需要用全局mock(比如GroovyMock)才能拦截并让它抛出指定异常,所以才会出现“预期异常但未抛出”的错误。
内容的提问来源于stack exchange,提问作者layman
相关产品推荐
相关产品推荐

