Ravkiran, your example can be reduced to

private fun example(x: Any?) {
    x!!
}

fun main(args: Array<String>) {
    example("")
    try {
        example(null)
    } catch (e: NullPointerException) {
    }
}

Anyway thank you both for these valuable inputs!

Inability to cover case of exception seems to be related to widely known 
JaCoCo limitation - see for example 
https://stackoverflow.com/a/54034393/244993 that refers to 
https://www.jacoco.org/jacoco/trunk/doc/faq.html "Source code lines with 
exceptions show no coverage. Why?" , because

x!!

compiles into something like

if (x == null) kotlin.jvm.internal.Intrinsics.throwNpe()

So even if one can question whether this branch needs to be tested or not 
(and hence shown as covered or not), as of now due to above limitation 
anyway seems better to implement filter 
- https://github.com/jacoco/jacoco/pull/802


Regards,
Evgeny


On Saturday, January 5, 2019 at 12:01:37 AM UTC+1, ravikiran...@gmail.com 
wrote:
>
> On Friday, 4 January 2019 14:44:00 UTC-8, raviki...@gmail.com  wrote:
> > On Wednesday, 26 December 2018 11:14:32 UTC-8, fate...@gmail.com  wrote:
> > > E.g. a jpa entity has a nullable field ID to be able to be saved. If I 
> request the entity from a repository which returns only saved entities, 
> then I have to use !!. operator to reference id values.
> > > Generally, such cases often occur when dealing with 
> lifecycle-dependent objects. I usually set a variable nullable to:
> > > * to force programmers to pay attention when using it
> > > * to make it possible to release memory by nullifying the variable
> > 
> > Yeah this is a valid one.
> > Even if we write a test that throws NPE, still it shows "1 of 2 branches 
> missed".
>
> Here is an example:
>
> Say we have a piece of code like this
>
> fun getMapValue(map: Map<String, Int?>, key: String): Int {
>  return map[key]!!
> }
> The possible tests that we can write for this are:
>
> @Test
> fun `verify getMapValue returns map value for a valid key`() {
>  val map = mapOf("a" to 1, "b" to 2)
>  val result = TestJacocoBranchCoverage().getMapValue(map, "a")
>  Assertions.assertEquals(result, 1)
> }
>
> @Test
> fun `verify getMapValue throws NPE for an invalid key`() {
>  val map = mapOf("a" to 1, "b" to 2)
>  assertThrows<NullPointerException> { 
> TestJacocoBranchCoverage().getMapValue(map, "c") }
> }
>
> map[key]!! this means return the value if not null else throw null pointer 
> exception. So both the test should ideally cover the whole code.
>
> But Jacoco still complaints about a missing branch.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"JaCoCo and EclEmma Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to jacoco+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jacoco/d795a5ab-c0e1-4d54-8013-bbfacababc9f%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to