Skip to content

Intermittent AssertionError when mocking AWS Java SDK #573

@chroche

Description

@chroche

Hi there,

I'm seeing intermittent errors when mocking the AWS Java SDK v2 within a Scala 2.12 project. The versions are as follows:

javacOptions ++= Seq("--release", "11")
scalaVersion := "2.12.20"
val awsSdkVersion = "2.24.13"

libraryDependencies += "org.scala-lang" % "scala-compiler" % scalaVersion.value
libraryDependencies += "software.amazon.awssdk" % "regions" % awsSdkVersion
libraryDependencies += "software.amazon.awssdk" % "auth" % awsSdkVersion
libraryDependencies += "software.amazon.awssdk" % "sts" % awsSdkVersion
libraryDependencies += "software.amazon.awssdk" % "s3" % awsSdkVersion
[...]
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.19" % Test
libraryDependencies += "org.mockito" %% "mockito-scala-scalatest" % "1.17.45" % Test
libraryDependencies += "org.mockito" % "mockito-core" % "5.18.0" % Test
libraryDependencies += "org.scalamock" %% "scalamock" % "7.3.3" % Test

One test is accessing S3 and giving the following stack trace about 50% of the time:

[info] - should create an S3Client and assume a role when bucket is passed in *** FAILED ***
[info]   java.lang.AssertionError: assertion failed: no symbol could be loaded from interface software.amazon.awssdk.services.sts.model.AssumeRoleResponse$Builder in class AssumeRoleResponse with name Builder and classloader sbt.internal.LayeredClassLoader@2790650b
[info]   at scala.reflect.internal.SymbolTable.throwAssertionError(SymbolTable.scala:185)
[info]   at scala.reflect.runtime.JavaMirrors$JavaMirror.classToScala1(JavaMirrors.scala:1068)
[info]   at scala.reflect.runtime.JavaMirrors$JavaMirror.$anonfun$classToScala$1(JavaMirrors.scala:1026)
[info]   at scala.reflect.runtime.JavaMirrors$JavaMirror.$anonfun$toScala$1(JavaMirrors.scala:137)
[info]   at scala.reflect.runtime.TwoWayCaches$TwoWayCache.$anonfun$toScala$1(TwoWayCaches.scala:50)
[info]   at scala.reflect.runtime.TwoWayCaches$TwoWayCache.toScala(TwoWayCaches.scala:46)
[info]   at scala.reflect.runtime.JavaMirrors$JavaMirror.toScala(JavaMirrors.scala:135)
[info]   at scala.reflect.runtime.JavaMirrors$JavaMirror.classToScala(JavaMirrors.scala:1026)
[info]   at scala.reflect.runtime.JavaMirrors$JavaMirror.typeToScala(JavaMirrors.scala:1131)
[info]   at scala.reflect.runtime.JavaMirrors$JavaMirror.targToScala$1(JavaMirrors.scala:1118)

Another test is accessing Secrets Manager and giving a similar error about 5% of the time:

[info] - should return secret config *** FAILED ***
[info]   java.lang.AssertionError: assertion failed: no symbol could be loaded from interface software.amazon.awssdk.services.secretsmanager.model.GetSecretValueResponse$Builder in class GetSecretValueResponse with name Builder and classloader sbt.internal.LayeredClassLoader@2790650b
[info]   at scala.reflect.internal.SymbolTable.throwAssertionError(SymbolTable.scala:185)
[info]   at scala.reflect.runtime.JavaMirrors$JavaMirror.classToScala1(JavaMirrors.scala:1068)
[info]   at scala.reflect.runtime.JavaMirrors$JavaMirror.$anonfun$classToScala$1(JavaMirrors.scala:1026)
[info]   at scala.reflect.runtime.JavaMirrors$JavaMirror.$anonfun$toScala$1(JavaMirrors.scala:137)
[info]   at scala.reflect.runtime.TwoWayCaches$TwoWayCache.$anonfun$toScala$1(TwoWayCaches.scala:50)
[info]   at scala.reflect.runtime.TwoWayCaches$TwoWayCache.toScala(TwoWayCaches.scala:46)
[info]   at scala.reflect.runtime.JavaMirrors$JavaMirror.toScala(JavaMirrors.scala:135)
[info]   at scala.reflect.runtime.JavaMirrors$JavaMirror.classToScala(JavaMirrors.scala:1026)
[info]   at scala.reflect.runtime.JavaMirrors$JavaMirror.typeToScala(JavaMirrors.scala:1131)
[info]   at scala.reflect.runtime.JavaMirrors$JavaMirror.targToScala$1(JavaMirrors.scala:1118)

The second test is actually very simple:

class cieSecretsManagerTest extends UnitSpec {

  private val secretsManagerClient = mock[SecretsManagerClient]
  private val getSecretValueResponse = mock[GetSecretValueResponse]

  it should "return secret config" in {
    val expectedHost = "some.host"
    val expectedPort = "1234"
    val expectedDbName = "test"
    val expectedPassword = "test12"
    val expectedUsername = "testUsername"
    val secret = s"""{"host":"$expectedHost","port":"$expectedPort","dbname":"$expectedDbName","password":"$expectedPassword","username":"$expectedUsername"}"""
    secretsManagerClient.getSecretValue(any[GetSecretValueRequest]) shouldReturn getSecretValueResponse
    getSecretValueResponse.secretString() shouldReturn secret
    val cieSecretsManager = new cieSecretsManager(secretsManagerClient)
    val actual = cieSecretsManager.getSecret("some-secret")
    actual.host shouldBe expectedHost
    actual.port shouldBe expectedPort
    actual.dbname shouldBe expectedDbName
    actual.password shouldBe expectedPassword
    actual.username shouldBe expectedUsername
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions