Skip to content

State associated with @Tested class + @Inject constructor doesn't appear to be cleaned up between test classes #258

@sixbangs

Description

@sixbangs

Minimum example:

@RunWith(Suite.class)
@Suite.SuiteClasses({ Test1.class, Test2.class })
public class TwoTests {}

public class A {
    @Inject
    public A(Double dep) {}

    public void doSomething(Boolean parameter) {}
}

public class Test1 {
    @Tested A a;
    @Injectable Double dep;

    @Test
    public void testOne() throws Exception {}
}

public class Test2 {
    @Mocked A a;

    @Test
    public void testTwo() throws Exception {
        new Verifications() {{
            a.doSomething(anyBoolean); times = 0;
        }};
    }
}

If Test1 is run before Test2, an NPE is raised with the following stack trace:

java.lang.NullPointerException
    at mockit.internal.state.ParameterNames.getName(ParameterNames.java:107)
    at mockit.internal.util.MethodFormatter.appendParameterName(MethodFormatter.java:137)
    at mockit.internal.util.MethodFormatter.appendFriendlyTypes(MethodFormatter.java:112)
    at mockit.internal.util.MethodFormatter.appendFriendlyMethodSignature(MethodFormatter.java:79)
    at mockit.internal.util.MethodFormatter.<init>(MethodFormatter.java:37)
    at mockit.internal.expectations.invocation.InvocationArguments.toString(InvocationArguments.java:144)
    at mockit.internal.expectations.invocation.ExpectedInvocation.toString(ExpectedInvocation.java:344)
    at java.lang.String.valueOf(String.java:2849)
    at java.lang.StringBuilder.append(StringBuilder.java:128)
    at mockit.internal.expectations.invocation.ExpectedInvocation.errorForMissingInvocation(ExpectedInvocation.java:260)
    at mockit.internal.expectations.BaseVerificationPhase.handleInvocation(BaseVerificationPhase.java:96)
    at mockit.internal.expectations.RecordAndReplayExecution.recordOrReplay(RecordAndReplayExecution.java:227)
    at A.doSomething(A.java)
    at Test2$1.<init>(Test2.java:19)
    at Test2.testTwo(Test2.java:18)
...

However, if Test2 is run first, both tests pass.

JMockit version: 1.21
JUnit version: 4.11

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions