Description
Description
The code generator overwrites static Enum values with themselves in tests where an Enum constant is required.
To Reproduce
Generate a test suite for the EnumExamples.isRedOrGreen
method below.
// Color.java
public enum Color {
UNDEFINED,
RED,
YELLOW,
GREEN
}
// EnumExamples.java
public class EnumExamples {
public boolean isRedOrGreen(@NotNull Color color) {
return color.equals(Color.YELLOW) || color.equals(Color.GREEN);
}
}
Expected behavior
No static field assignment should take place in any of generated test cases.
Test cases could look like the following example:
@Test
@DisplayName("isRedOrGreen: return color.equals(Color.YELLOW) || color.equals(Color.GREEN) : False -> return color.equals(Color.YELLOW) || color.equals(Color.GREEN)")
public void testIsRedOrGreen_ColorEqualsOrColorEquals() throws ClassNotFoundException, Exception {
EnumExamples enumExamples = new EnumExamples();
boolean actual = enumExamples.isRedOrGreen(Color.YELLOW);
assertTrue(actual);
}
Actual behavior
Each test case involves static field assignments with their original values.
Visual proofs (screenshots, logs, images)
///region SUCCESSFUL EXECUTIONS for method isRedOrGreen(enums.Color)
/**
* <pre>
* Test returns from: {@code return color.equals(Color.YELLOW) || color.equals(Color.GREEN); }
* </pre>
*/
@Test
@DisplayName("isRedOrGreen: return color.equals(Color.YELLOW) || color.equals(Color.GREEN) : False -> return color.equals(Color.YELLOW) || color.equals(Color.GREEN)")
public void testIsRedOrGreen_ColorEqualsOrColorEquals() throws ClassNotFoundException, Exception {
Color prevYELLOW = Color.YELLOW;
try {
Color yellow = Color.YELLOW;
Class colorClazz = Class.forName("enums.Color");
setStaticField(colorClazz, "YELLOW", yellow);
EnumExamples enumExamples = new EnumExamples();
boolean actual = enumExamples.isRedOrGreen(yellow);
assertTrue(actual);
} finally {
setStaticField(Color.class, "YELLOW", prevYELLOW);
}
}
/**
* <pre>
* Test returns from: {@code return color.equals(Color.YELLOW) || color.equals(Color.GREEN); }
* </pre>
*/
@Test
@DisplayName("isRedOrGreen: return color.equals(Color.YELLOW) || color.equals(Color.GREEN) : False -> return color.equals(Color.YELLOW) || color.equals(Color.GREEN)")
public void testIsRedOrGreen_ColorEqualsOrColorEquals_1() throws ClassNotFoundException, Exception {
Color prevYELLOW = Color.YELLOW;
Color prevGREEN = Color.GREEN;
try {
Color yellow = Color.YELLOW;
Class colorClazz = Class.forName("enums.Color");
setStaticField(colorClazz, "YELLOW", yellow);
Color green = Color.GREEN;
setStaticField(colorClazz, "GREEN", green);
EnumExamples enumExamples = new EnumExamples();
Color color = Color.UNDEFINED;
boolean actual = enumExamples.isRedOrGreen(color);
assertFalse(actual);
} finally {
setStaticField(Color.class, "YELLOW", prevYELLOW);
setStaticField(Color.class, "GREEN", prevGREEN);
}
}
/**
* <pre>
* Test returns from: {@code return color.equals(Color.YELLOW) || color.equals(Color.GREEN); }
* </pre>
*/
@Test
@DisplayName("isRedOrGreen: return color.equals(Color.YELLOW) || color.equals(Color.GREEN) : True -> return color.equals(Color.YELLOW) || color.equals(Color.GREEN)")
public void testIsRedOrGreen_ColorEqualsOrColorEquals_2() throws ClassNotFoundException, Exception {
Color prevYELLOW = Color.YELLOW;
Color prevGREEN = Color.GREEN;
try {
Color yellow = Color.YELLOW;
Class colorClazz = Class.forName("enums.Color");
setStaticField(colorClazz, "YELLOW", yellow);
Color green = Color.GREEN;
setStaticField(colorClazz, "GREEN", green);
EnumExamples enumExamples = new EnumExamples();
boolean actual = enumExamples.isRedOrGreen(green);
assertTrue(actual);
} finally {
setStaticField(Color.class, "YELLOW", prevYELLOW);
setStaticField(Color.class, "GREEN", prevGREEN);
}
}
///endregion
Environment
Java: 1.8.
Test framework: JUnit5.
Mock strategy: No mocks.
Mock static: No static mocking.
Timeout for class: 60 sec.
Parametrized test: Not parametrized.
Additional context
This issue is not critical, as tests are successfully generated and working. In a way, it may be more a feature request than a bug report.
Metadata
Metadata
Assignees
Labels
Type
Projects
Status