Skip to content

Static Enum values are needlessly overwritten #306

Closed
@dtim

Description

@dtim

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

comp-codegenIssue is related to code generatorctg-enhancementNew feature, improvement or change requestpriority-top-focusTop priority chosen by dev team

Type

No type

Projects

Status

Done

Relationships

None yet

Development

No branches or pull requests

Issue actions