尽管方法位于.class文件中,但在运行类时仍获取NoSuchMethodException

2020年10月13日 30点热度 0条评论

我正在为我的大学的一个项目编写后端,但遇到一个我不理解的错误。

我正在与IntelliJ,Gradle一起使用,并将Spock用作测试环境。
该项目的目标之一是利用Amazon NoSQL数据库解决方案DynamoDB。
要测试后端的方法,请使用AmazonDB Local。

目前,我正在为后端的各种方法编写测试……或者至少我尝试过。
当我运行我的第一个测试时,一旦达到“GetBookWithTitle”方法,我就会收到NoSuchMethodException异常。 (有趣的事实:“AddBook”方法似乎可以正常工作)。

这是测试的代码:

def "Test adding a book to the database"(){
    when: "Adding a book"
        methods.AddBook("TestBook", "Sebastian Müller", 1990, "Gregors", "FunkyTestCover", mapper);

    then: "The book should be added"
        methods.GetBookWithTitle("TestBook", mapper) != null;
}

这是“GetBookWithTitle”方法的来源:

public Book GetBookWithTitle(String title, DynamoDBMapper mapper){
    Book result = mapper.load(Book.class, title);
    return result;
}

我试过的

-使用相应的gradle任务清理项目

-手动删除项目的“build”文件夹

-反编译.class文件以确保存在“GetBookWithTitle”

所以我的问题是:是否有人提供了此错误的根源?

如果提供的信息不足,我会给您更多:)

解决方案如下:

好的,我找到了答案。这完全是另外一回事,与DynamoDB及其将数据库项映射到Java类的功能有关。
映射器类显然需要我的Book类没有的标准构造函数。

对于那些感兴趣的人:

DynamoDBMapper.load方法在内部调用Class.NewInstance()。此方法只能使用不带参数的标准构造函数/构造函数。由于我的类(class)中没有此类构造函数,因此他抛出了NoSuchMethodException。