Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

java.lang.NoSuchMethodException on mock(Timestamp.class) #256

Closed
marbon87 opened this issue Apr 2, 2020 · 7 comments
Closed

java.lang.NoSuchMethodException on mock(Timestamp.class) #256

marbon87 opened this issue Apr 2, 2020 · 7 comments
Assignees
Labels
Milestone

Comments

@marbon87
Copy link

marbon87 commented Apr 2, 2020

When i try to mock Timestamp.class with easymock's mock(), i get the following error:

Caused by: java.lang.NoSuchMethodException: $java.sql.Timestamp$$EnhancerByCGLIB$$f28f2712.CGLIB$SET_THREAD_CALLBACKS([Lorg.easymock.cglib.proxy.Callback;)
	at java.base/java.lang.Class.getDeclaredMethod(Class.java:2475)
	at org.easymock.cglib.proxy.Enhancer.getCallbacksSetter(Enhancer.java:809)
	at org.easymock.cglib.proxy.Enhancer.access$000(Enhancer.java:63)
	at org.easymock.cglib.proxy.Enhancer$EnhancerFactoryData.<init>(Enhancer.java:414)
	... 55 more

This is the test-setup

@RunWith(PowerMockRunner.class)
public class FehlerTest {
    @Test
    public void example() {
        mock(Timestamp.class);
    }
}


4.0.0

<groupId>org.example</groupId>
<artifactId>powermock-easymock-failure</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
    <powermock.version>2.0.2</powermock.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>${powermock.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-easymock</artifactId>
        <version>${powermock.version}</version>
        <scope>test</scope>
    </dependency>
</dependencies>

Running with adopt-openjdk-11.0.6

@henri-tremblay
Copy link
Contributor

This looks like a dependency issue. It should work perfectly. I tried you dependencies and it worked. My guess is that you have more than that. For example, an old cglib version.

If I do a mvn dependency:tree, I see this:

[INFO] pro.tremblay:test:jar:1.0-SNAPSHOT
[INFO] +- org.powermock:powermock-module-junit4:jar:2.0.2:test
[INFO] |  +- org.powermock:powermock-module-junit4-common:jar:2.0.2:test
[INFO] |  |  +- org.powermock:powermock-reflect:jar:2.0.2:test
[INFO] |  |  |  +- net.bytebuddy:byte-buddy:jar:1.9.3:test
[INFO] |  |  |  \- net.bytebuddy:byte-buddy-agent:jar:1.9.3:test
[INFO] |  |  \- org.powermock:powermock-core:jar:2.0.2:test
[INFO] |  |     \- org.javassist:javassist:jar:3.24.0-GA:test
[INFO] |  +- junit:junit:jar:4.12:test
[INFO] |  \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] \- org.powermock:powermock-api-easymock:jar:2.0.2:test
[INFO]    +- org.powermock:powermock-api-support:jar:2.0.2:test
[INFO]    +- cglib:cglib-nodep:jar:3.2.9:test
[INFO]    \- org.easymock:easymock:jar:4.0.1:test
[INFO]       \- org.objenesis:objenesis:jar:3.0.1:test

What do you see?

@henri-tremblay henri-tremblay self-assigned this Apr 3, 2020
@marbon87
Copy link
Author

marbon87 commented Apr 3, 2020

That's my dependecy tree from the example, same as yours:

[INFO] org.example:powermock-easymock-failure:jar:1.0-SNAPSHOT
[INFO] +- org.powermock:powermock-module-junit4:jar:2.0.2:test
[INFO] |  +- org.powermock:powermock-module-junit4-common:jar:2.0.2:test
[INFO] |  |  +- org.powermock:powermock-reflect:jar:2.0.2:test
[INFO] |  |  |  +- net.bytebuddy:byte-buddy:jar:1.9.3:test
[INFO] |  |  |  \- net.bytebuddy:byte-buddy-agent:jar:1.9.3:test
[INFO] |  |  \- org.powermock:powermock-core:jar:2.0.2:test
[INFO] |  |     \- org.javassist:javassist:jar:3.24.0-GA:test
[INFO] |  +- junit:junit:jar:4.12:test
[INFO] |  \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] \- org.powermock:powermock-api-easymock:jar:2.0.2:test
[INFO]    +- org.powermock:powermock-api-support:jar:2.0.2:test
[INFO]    +- cglib:cglib-nodep:jar:3.2.9:test
[INFO]    \- org.easymock:easymock:jar:4.0.1:test
[INFO]       \- org.objenesis:objenesis:jar:3.0.1:test


That's the complete pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>powermock-easymock-failure</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <powermock.version>2.0.2</powermock.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-module-junit4</artifactId>
            <version>${powermock.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-api-easymock</artifactId>
            <version>${powermock.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
            </plugin>
        </plugins>
    </build>
</project>

Maven 3.6.3, Java 11.0.6

@marbon87
Copy link
Author

marbon87 commented Apr 3, 2020

With that version of java it is running fine:

» java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_212-b03)

@henri-tremblay
Copy link
Contributor

Ah. I missed that. Java 11. Indeed it fails. On the entire java.sql package. I'm suspecting some problem about where the mock is created. I will look into it.

@henri-tremblay henri-tremblay added this to the 4.3 milestone Apr 4, 2020
@henri-tremblay
Copy link
Contributor

First thing I can say, without powermock it works perfectly. It's a classloader issue. The mock is created in the powermock classloader. And the requested Callback is not from the same classloader as the one used to create the mock.

Not sure why yet...

@marbon87
Copy link
Author

Hey @henri-tremblay , any update on this?

@henri-tremblay
Copy link
Contributor

No sorry. And I'm not sure I will have the time soon. Any help is appreciated.

@henri-tremblay henri-tremblay modified the milestones: 4.3, 4.4 Apr 15, 2021
@henri-tremblay henri-tremblay removed this from the 5.0.0 milestone Oct 15, 2022
@henri-tremblay henri-tremblay added this to the 5.2.0 milestone Jan 8, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants