Closed
Description
Description
Java fuzzer ignores type parameters of fields (raw types are used), for example, in class below List
is used instead of List<String>
, causing fuzzer to generate lists of arbitrary Object
s.
public class StringListHolder {
private List<String> strings;
public List<String> getStrings() {
return strings;
}
public void setStrings(List<String> strings) {
this.strings = strings;
}
public void methodUnderTest() {}
}
To Reproduce
Run the following unit test
@Test
fun `fuzzer correctly works with settable field that has a parameterized type`() {
val seenStringListHolders = mutableListOf<StringListHolder>()
var remainingRuns = 100
runBlockingWithContext {
runJavaFuzzing(
TestIdentityPreservingIdGenerator,
methodUnderTest = StringListHolder::methodUnderTest.javaMethod!!.executableId,
constants = emptyList(),
names = emptyList(),
) { thisInstance, _, _ ->
thisInstance?.let {
seenStringListHolders.add(
ValueConstructor().construct(listOf(it.model)).single().value as StringListHolder
)
}
remainingRuns--
BaseFeedback(Trie.emptyNode(), if (remainingRuns > 0) Control.CONTINUE else Control.STOP)
}
}
val seenStrings = seenStringListHolders.flatMap { it.strings.orEmpty().filterNotNull() }
assertNotEquals(emptyList<String>(), seenStrings)
seenStrings.forEach { assertInstanceOf(String::class.java, it) }
}
Expected behavior
Test passes.
Actual behavior
Test fails.
Visual proofs (screenshots, logs, images)
class java.lang.Object cannot be cast to class java.lang.String (java.lang.Object and java.lang.String are in module java.base of loader 'bootstrap')
java.lang.ClassCastException: class java.lang.Object cannot be cast to class java.lang.String (java.lang.Object and java.lang.String are in module java.base of loader 'bootstrap')
at org.utbot.fuzzing.JavaFuzzingTest.fuzzer correctly works with settable field that has a parameterized type(JavaFuzzingTest.kt:412)
Metadata
Metadata
Assignees
Type
Projects
Status
Done