首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spock: Graphic2d和BuffredImage的单元测试

Spock: Graphic2d和BuffredImage的单元测试
EN

Stack Overflow用户
提问于 2020-12-04 07:30:30
回答 1查看 48关注 0票数 0

我有一个困难如何测试下面的class.How我可以写一个测试来检查图形是否绘制具有特定宽度,高度的“名称”?以及我可以使用spock针对以下类编写哪些其他测试。我该如何模拟异常呢?

代码语言:javascript
复制
 class NameCardCreator{
    
       private val bufferedImage = BufferedImage(580, 380, BufferedImage.TYPE_INT_ARGB)
        var name: String? = null
        const val DISCLAIMER = "Name is Correct"
        fun createNameCard(): String?
        {
            var generic64: String? = null
            try {
                dashed = BasicStroke(3f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0f, floatArrayOf(5f), 0f)
                val graphics =  bufferedImage.createGraphics()
                graphics.drawRoundRect(20, 20, 535, 340, 15, 15) //actual card size
                val fontMetrics = graphics.fontMetrics
                graphics.drawLine(300, 120, 540, 120)
                if (!name.isNullOrEmpty()) {
                    graphics.drawString(name, 300, 110)
                }
                graphics.drawString(DISCLAIMER, 50, 290)
                generic64 = toBase64(bufferedImage)
                return generic64
            } catch (ie: IOException) {
                logger.info("Name card could not be generated $ie.message")
            }
            return generic64
        }
        
        protected fun toBase64(bufferedImage: BufferedImage): String? {
            var base64Str: String? = null
            var os: ByteArrayOutputStream? = null
            var b64: OutputStream? = null
            try {
                os = ByteArrayOutputStream()
                b64 = Base64OutputStream(os)
                ImageIO.write(bufferedImage, "png", b64)
                base64Str = os.toString("UTF-8")
            } catch (e: Exception) {
                logger.error(e.message)
            } finally {
                os?.close()
                b64?.close()
            }
            return base64Str
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-04 16:33:47

我不会说Kotlin,但我对您的类做了一点修改,只是添加了一个单独的构造函数,您可以在其中注入一个BufferedImage。一旦你能做到这一点,你也可以注入一个模拟。如果您将createGraphics()存根到该模拟中以返回另一个Graphics2D模拟,则可以很容易地验证是否使用预期名称调用了graphics.drawString(name, 300, 110)

此外,在createNameCard()中不需要捕获任何IOException,因为在toBase64()中可以捕获所有异常。因此,要么完全删除createNameCard()中的try-catch (变体A),要么删除toBase64()中的catch子句,让您在调用方法(变体B)中捕获一些内容。

无论如何,我保留了这两个catch块,并向您展示了如何获得整个文件的100%测试覆盖率,包括错误案例:

代码语言:javascript
复制
package de.scrum_master.testing.kotlin

import org.apache.commons.codec.binary.Base64OutputStream
import java.awt.BasicStroke
import java.awt.image.BufferedImage
import java.io.ByteArrayOutputStream
import java.io.IOException
import java.io.OutputStream
import javax.imageio.ImageIO

class NameCardCreator {
  private var bufferedImage = BufferedImage(580, 380, BufferedImage.TYPE_INT_ARGB)
  private var name: String? = null
  val DISCLAIMER = "Name is Correct"

  constructor()

  constructor(name: String?) {
    this.name = name
  }

  constructor(bufferedImage: BufferedImage, name: String?) {
    this.bufferedImage = bufferedImage
    this.name = name
  }

  fun createNameCard(): String? {
    var generic64: String? = null
    try {
      val dashed = BasicStroke(3f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0f, floatArrayOf(5f), 0f)
      val graphics = bufferedImage.createGraphics()
      graphics.drawRoundRect(20, 20, 535, 340, 15, 15) // actual card size
      val fontMetrics = graphics.fontMetrics
      graphics.drawLine(300, 120, 540, 120)
      if (!name.isNullOrEmpty()) {
        graphics.drawString(name, 300, 110)
      }
      graphics.drawString(DISCLAIMER, 50, 290)
      generic64 = toBase64(bufferedImage)
      return generic64
    } catch (ie: IOException) {
      println("Name card could not be generated: $ie.message")
    }
    return generic64
  }

  protected fun toBase64(bufferedImage: BufferedImage): String? {
    var base64Str: String? = null
    var os: ByteArrayOutputStream? = null
    var b64: OutputStream? = null
    try {
      os = ByteArrayOutputStream()
      b64 = Base64OutputStream(os)
      ImageIO.write(bufferedImage, "png", b64)
      base64Str = os.toString("UTF-8")
    } catch (e: Exception) {
      println("Base64 encoding failed: $e.message")
    } finally {
      os?.close()
      b64?.close()
    }
    return base64Str
  }

}
代码语言:javascript
复制
package de.scrum_master.testing.kotlin

import org.apache.commons.codec.binary.Base64
import spock.lang.Specification

import javax.imageio.ImageIO
import java.awt.*
import java.awt.image.BufferedImage

class NameCardCreatorTest extends Specification {
  def "check that base64 actually encodes an image"() {
    given:
    def nameCardCreator = new NameCardCreator("John Doe")

    when:
    def imageBase64 = nameCardCreator.createNameCard()
//    println imageBase64
    def imageBytes = new Base64().decode(imageBase64)
//    new FileOutputStream("name-card.png").write(imageBytes)
    def bufferedImage = ImageIO.read(new ByteArrayInputStream(imageBytes))

    then:
    bufferedImage.width == 580
    bufferedImage.height == 380
  }

  def "check that name was written on card"() {
    given:
    def graphics2D = Mock(Graphics2D)
    def bufferedImage = Mock(BufferedImage) {
      // Return Graphics2D mock
      createGraphics() >> graphics2D
    }
    when:
    new NameCardCreator(bufferedImage, "John Doe").createNameCard()

    then:
    1 * graphics2D.drawString("John Doe", _, _)
  }

  def "exception during card creation leads to null result"() {
    given:
    def bufferedImage = Mock(BufferedImage) {
      // Throw an exception for each method call
      _(*_) >> { throw new IOException("uh-oh") }
    }
    expect:
    new NameCardCreator(bufferedImage, "John Doe").createNameCard() == null
  }

  def "exception during base64 encoding leads to null result"() {
    given:
    def bufferedImage = Mock(BufferedImage) {
      // Throw an exception for each method call
      _(*_) >> { throw new IOException("uh-oh") }
    }

    expect:
    new NameCardCreator().toBase64(bufferedImage) == null
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65135760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档