UnitTestBot / UTBotJava

Automated unit test generation and precise code analysis for Java
Apache License 2.0
132 stars 38 forks source link

No validation of a Collection changing passed as input parameter #2372

Open alisevych opened 1 year ago

alisevych commented 1 year ago

Description

No validation of a Collection of elements in Spring No configuration test

To Reproduce

  1. Install UnitTestBot plugin built from main in IntelliJ IDEA 2023.1.3
  2. Open spring-petclinic project
  3. Generate tests for Owner class
  4. Check successful test on (pet.isNew()): True branch

Expected behavior

Assert added Pet exists in owner.pets field

Actual behavior

List of null values is created. No checks for the List are made.

Screenshots, logs

/**
     * @utbot.classUnderTest {@link Owner}
     * @utbot.methodUnderTest {@link Owner#addPet(Pet)}
     * @utbot.executesCondition {@code (pet.isNew()): True}
     * @utbot.invokes {@link Owner#getPets()}
     * @utbot.invokes {@link java.util.List#add(Object)}
     */
    @Test
    @DisplayName("addPet: pet.isNew() : True -> ListAdd")
    public void testAddPet_PetIsNew() {
        ArrayList arrayList = new ArrayList();
        arrayList.add(null);
        arrayList.add(null);
        arrayList.add(null);
        Pet petMock1 = mock(Pet.class);
        (when(petMock1.isNew())).thenReturn(true);

        owner.addPet(petMock1);
    }

Environment

IntelliJ IDEA version - Ultimate 2023.1.3 Project - Gradle JDK - 17

EgorkaKulikov commented 1 year ago

I created the non-Spring project containing two classes:

  1. Pet
    public class Pet {
    public String name;
    }

2.Service

import java.util.ArrayList;

public class Service {
    public ArrayList<Pet> pets;

    public void addPet(Pet pet) {
        pets.add(pet);
    }
}

and generated tests for addPet method.

The following tests were generated:

public final class ServiceTest {

    @Test
    @DisplayName("addPet: -> ArrayListAdd")
    public void testAddPet_ArrayListAdd() {
        Service service = new Service();
        ArrayList arrayList = new ArrayList();
        arrayList.add(null);
        arrayList.add(null);
        arrayList.add(null);
        service.pets = arrayList;

        service.addPet(null);
    }

    @Test
    @DisplayName("addPet: pets.add(pet) : True -> ThrowNullPointerException")
    public void testAddPet_ArrayListAdd_1() {
        Service service = new Service();

        /* This test fails because method [pack.Service.addPet] produces [java.lang.NullPointerException]
            pack.Service.addPet(Service.java:10) */
        service.addPet(null);
    }
}

There are no asserts on pets field state...

alisevych commented 1 year ago

It would be great to check if UtExecution contains the information on changing field with Collection. It can be accessed by method Owner#getPets() call to validate the changes from the test.