Description
When creating instances of arbitrary classes Java fuzzer only considers their accessible constructors. However, some classes (e.g. LocalDateTime) only have private constructors while their instances are meant to be created using static methods.
Real world (concrete) example
Same as in #2428
To Reproduce
Run the following unit test.
@Test
fun `fuzzer can create instances of classes without public constructors but with static factory method in their class`() {
var seenLocalDateTime = false
runBlockingWithContext {
runJavaFuzzing(
TestIdentityPreservingIdGenerator,
methodUnderTest = LocalDateTime::getMinute.javaMethod!!.executableId,
constants = emptyList(),
names = emptyList(),
) { thisInstance, _, _ ->
val control = runCatching {
ValueConstructor()
.construct(listOfNotNull(thisInstance?.model))
.singleOrNull()?.value
}.getOrNull()?.let { constructedThisInstance ->
assertInstanceOf(LocalDateTime::class.java, constructedThisInstance)
seenLocalDateTime = true
Control.STOP
} ?: Control.CONTINUE
BaseFeedback(Trie.emptyNode(), control)
}
}
assertTrue(seenLocalDateTime) { "No value was generated for type LocalDateTime" }
}
Expected behavior
Test passes.
Actual behavior
Test fails.
Visual proofs (screenshots, logs, images)
No value was generated for type LocalDateTime ==> expected: <true> but was: <false>