Description
In some cases when random numbers are generated in fixed loop, symbolic engine cannot generate any test.
To Reproduce
- Install UnitTestBot plugin built from main in IntelliJ IDEA
- In settings set Symbolic = 100%
- Generate tests for following code
public int randomSum(int n) {
List<Integer> weight = new ArrayList<>();
for (int i = 0; i < 4; i++) {
weight.add(new Random().nextInt(n));
}
return weight.size();
}
Expected behavior
Tests are generated, similar to what is listed in 'Additional context' section.
Actual behavior
No tests are generated.
Additional context
In case loop statement changed to
for (int i = 0; i < n; i++)
then it starts working similar to what is expected:
public final class RecursionTest {
///region Test suites for executable org.example.Recursion.randomSum
///region SYMBOLIC EXECUTION: SUCCESSFUL EXECUTIONS for method randomSum(int)
/**
* @utbot.classUnderTest {@link Recursion}
* @utbot.methodUnderTest {@link Recursion#randomSum(int)}
* @utbot.returnsFrom {@code return weight.size();}
*/
@Test
@DisplayName("randomSum: -> return weight.size()")
public void testRandomSum_ReturnWeightSize() {
Recursion recursion = new Recursion();
int actual = recursion.randomSum(0);
assertEquals(0, actual);
}
/**
* @utbot.classUnderTest {@link Recursion}
* @utbot.methodUnderTest {@link Recursion#randomSum(int)}
* @utbot.iterates iterate the loop {@code for(int i = 0; i < n; i++)} once
* @utbot.returnsFrom {@code return weight.size();}
*/
@Test
@DisplayName("randomSum: RandomNextInt -> return weight.size()")
public void testRandomSum_ListAdd() {
MockedConstruction mockedConstruction = null;
try {
mockedConstruction = mockConstruction(Random.class, (Random randomMock, Context context) -> (when(randomMock.nextInt(anyInt()))).thenReturn(0));
/* WARNING!!! Automatically used "Mockito static mocking" framework for mocking statics
because execution encountered flaky methods
To change this behaviour edit [Settings -> UtBot -> Force static mocking] */
Recursion recursion = new Recursion();
int actual = recursion.randomSum(1);
assertEquals(1, actual);
} finally {
mockedConstruction.close();
}
}
Description
In some cases when random numbers are generated in fixed loop, symbolic engine cannot generate any test.
To Reproduce
Expected behavior
Tests are generated, similar to what is listed in 'Additional context' section.
Actual behavior
No tests are generated.
Additional context
In case loop statement changed to
for (int i = 0; i < n; i++)then it starts working similar to what is expected: