our project is using org.springframework.data.cassandra.mapping.Table annotations to create tables in Cassandra automatically when the Java process starts. Unfortunately, when we enable JaCoCo to measure code coverage this table creation mechanism is omitted somehow and the tables are not created in Cassandra DB. We end-up with exception like this while making insert statements:
java.lang.IllegalArgumentException: Invalid value [Z@7e4afb38 of type unknown to the query builder
at com.datastax.driver.core.querybuilder.Utils.appendStringIfValid(Utils.java:133) ~[cassandra-driver-core-2.1.4.jar:na]
at com.datastax.driver.core.querybuilder.Utils.appendValue(Utils.java:113) ~[cassandra-driver-core-2.1.4.jar:na]
at com.datastax.driver.core.querybuilder.Utils.appendValue(Utils.java:92) ~[cassandra-driver-core-2.1.4.jar:na]
at com.datastax.driver.core.querybuilder.Utils.joinAndAppendValues(Utils.java:58) ~[cassandra-driver-core-2.1.4.jar:na]
at com.datastax.driver.core.querybuilder.Insert.buildQueryString(Insert.java:59) ~[cassandra-driver-core-2.1.4.jar:na]
at com.datastax.driver.core.querybuilder.Batch.buildQueryString(Batch.java:69) ~[cassandra-driver-core-2.1.4.jar:na]
at com.datastax.driver.core.querybuilder.BuiltStatement.toString(BuiltStatement.java:186) ~[cassandra-driver-core-2.1.4.jar:na]
at org.springframework.cassandra.core.CqlTemplate$12.doInSession(CqlTemplate.java:500) ~[spring-cql-1.4.1.RELEASE.jar:na]
at org.springframework.cassandra.core.CqlTemplate$12.doInSession(CqlTemplate.java:494) ~[spring-cql-1.4.1.RELEASE.jar:na]
at org.springframework.cassandra.core.CqlTemplate.doExecute(CqlTemplate.java:471) ~[spring-cql-1.4.1.RELEASE.jar:na]
at org.springframework.cassandra.core.CqlTemplate.doExecute(CqlTemplate.java:494) ~[spring-cql-1.4.1.RELEASE.jar:na]
at org.springframework.cassandra.core.CqlTemplate.execute(CqlTemplate.java:1219) ~[spring-cql-1.4.1.RELEASE.jar:na]
Since this exception doesn't give much info we executed the CQL statement causing it from command line
When executing the same statement from cqlsh in Cassandra:
cqlsh> BEGIN BATCH INSERT INTO keyspace.dbschemaversion(updatedTime,schemaVersion,vrmVersion) VALUES (1487936595530,2,'');INSERT INTO keyspace.dbschemalatestversion(latestVersion) VALUES (2);APPLY BATCH;
We get error:
InvalidRequest: code=2200 [Invalid query] message="unconfigured table dbschemaversion"
Obviously the table is not created. But if we disable JaCoCo agent, the tables are created. Here is how a table looks using this annotation:
@Table(value = DbSchemaVersion.tableName)
public class DbSchemaVersion {
@org.springframework.data.annotation.Transient
public static final String tableName = "dbschemaversion";
@PrimaryKey
private Integer schemaVersion;
private String vrmVersion;
private Date updatedTime;
.... getters/setters
}
Any ideas anyone?
To collect execution data JaCoCo instruments the classes under test which adds two members to the classes: A private static field $jacocoData and a private static method $jacocoInit(). Both members are marked as synthetic.
Please change your code to ignore synthetic members. This is a good practice anyways as also the Java compiler creates synthetic members in certain situation.