首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何修复此错误: java.lang.NoSuchMethodError:'java.lang.AutoCloseable java.lang.AutoCloseable

如何修复此错误: java.lang.NoSuchMethodError:'java.lang.AutoCloseable java.lang.AutoCloseable
EN

Stack Overflow用户
提问于 2021-05-07 09:13:29
回答 4查看 20.9K关注 0票数 10

因此,我在Spring项目中得到了这个错误:

代码语言:javascript
运行
复制
'java.lang.AutoCloseable org.mockito.MockitoAnnotations.openMocks(java.lang.Object)'
    java.lang.NoSuchMethodError: 'java.lang.AutoCloseable org.mockito.MockitoAnnotations.openMocks(java.lang.Object)'

我似乎无法修复它。我已经搜索了答案,但我得到的唯一答案是删除mockito-所有从您的依赖项,但我没有在我的gradle.build文件中的第一。

我的build.gradle文件:

代码语言:javascript
运行
复制
plugins {
    id 'org.springframework.boot' version '2.4.2'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id "org.sonarqube" version "3.0"
    id 'jacoco'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '15'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}


dependencies {
    compile 'org.apache.httpcomponents:httpcore:4.4.1'
    compile 'org.apache.httpcomponents:httpclient:4.5'
    implementation('io.jsonwebtoken:jjwt:0.2')
    implementation 'org.springframework.boot:spring-boot-starter-mail'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compile 'junit:junit:4.12'
    implementation 'org.modelmapper:modelmapper:2.4.1'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'mysql:mysql-connector-java'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    implementation 'org.eclipse.jgit:org.eclipse.jgit:5.4.2.201908231537-r'
    /**
     * JUnit jupiter with mockito.
     */
    testCompile group: 'org.mockito', name: 'mockito-junit-jupiter', version: '2.19.0'

    testCompile group: 'org.mockito', name: 'mockito-core', version: '2.19.0'
    testCompile group: 'org.springframework.security', name: 'spring-security-test', version: '5.1.6.RELEASE'
}

sonarqube{
    properties{
        property 'sonarjava.source', '1.8'
        property 'sonar.java.coveragePlugin', 'jacoco'
        property 'sonar.jacoco.reportPaths', 'build/reports/jacoco/test/jacocoTestReport.xml'
    }
}
test {
    useJUnitPlatform()
}

我似乎找不到解决方案,所以我来到这里,在这里,一些代码上帝也许可以帮助我解决我的问题。

我看到这个错误的文件是一个测试类:

测试类:

代码语言:javascript
运行
复制
package com.example.demo.Service;

import com.example.demo.DTO.PartyLeaderDto;
import com.example.demo.Model.PartyLeader;
import com.example.demo.Repository.PartyLeaderRepository;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import static org.mockito.Mockito.verify;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.modelmapper.ModelMapper;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Optional;

import static org.mockito.Mockito.when;
import static org.mockito.ArgumentMatchers.argThat;

@SpringBootTest
@AutoConfigureMockMvc
public class PartyLeaderServiceMockTest {
    @Rule
    public MockitoRule initRule = MockitoJUnit.rule();

    @Mock
    private PartyLeaderRepository partyLeaderRepository;

    @Mock
    private ModelMapper modelMapper;

    @InjectMocks
    private PartyLeaderService partyLeaderService; // this is like calling new PartyLeaderService(partyLeaderRepository, modelMapper);


    @Test
    void whenSavePartyLeader_thenCorrectPartyLeaderSaved() {
        // given
        var input = PartyLeaderDto.builder()
                .name("Josse")
                .apperance("Link of image")
                .build();

        // when
        partyLeaderService.savePartyLeader(input);


        // then
        verify(partyLeaderRepository).save(argThat(entity ->
                entity.getName().equals("Josse")
                        && entity.getApperance().equals("Link of image")));
    }


    @Test
    void whenGetPartyLeader_ShouldReturnCorrectLeaderData() {
        // given
        var partyLeaderEntity = PartyLeader.builder()
                .name("Josse")
                .apperance("Link of image")
                .build();
        var partyLeaderDto = PartyLeaderDto.builder()
                .name("Josse")
                .apperance("Link of image")
                .build();
        when(partyLeaderRepository.findById(3)).thenReturn(Optional.of(partyLeaderEntity));
        when(modelMapper.map(partyLeaderEntity, PartyLeaderDto.class)).thenReturn(partyLeaderDto);

        // when
        var result = partyLeaderService.getPartyLeader(3);

        // then
        Assert.assertEquals(result, partyLeaderDto);
    }
}

我的两个测试都有相同的错误。

有谁可以帮我?提前感谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-06-27 00:18:58

问题是由jar冲突引起的

我们需要排除

代码语言:javascript
运行
复制
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit</groupId>
                <artifactId>junit</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-core</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-all</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

并包括

代码语言:javascript
运行
复制
<dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>3.11.2</version>
    </dependency>
票数 14
EN

Stack Overflow用户

发布于 2021-08-04 19:18:37

在面对同样的问题之后。请看原木痕迹。

代码语言:javascript
运行
复制
java.lang.NoSuchMethodError: org.mockito.MockitoAnnotations.openMocks(Ljava/lang/Object;)Ljava/lang/AutoCloseable;
    at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.initMocks(MockitoTestExecutionListener.java:83)

终于找到了一个解决方案:

MockitoAnnotations.initMock() Mockito 2中,有一个方法,该方法在Mockito JUnit 5 version 3中被废弃并替换为MockitoAnnotations.openMocks()。MockitoAnnotations.openMocks()方法返回一个AutoClosable实例,该实例可用于在测试后关闭资源。

手动初始化

在做任何其他事情之前,我们必须添加Mockito依赖项。

代码语言:javascript
运行
复制
dependencies {
    testImplementation('org.mockito:mockito-core:3.7.7')
}

MockitoAnnotations.openMocks( this )调用告诉Mockito扫描这个测试类实例,以查找任何带有@Mock注释的字段,并将这些字段初始化为mocks。

Pros:

易于创建的模拟非常易读

Cons:

不验证框架使用情况或检测不正确的自动锁注入,我们还可以告诉Mockito将模拟自动注入到带有@InjectMocks注解的字段。

当调用MockitoAnnotations.openMocks()时,Mockito将:

为使用@Mock注释注释的字段创建模拟,创建带有@InjectMocks注释的字段实例,并尝试使用@InjectMocks将模拟注入其中,与手动实例化实例时相同,但现在是自动的。

代码语言:javascript
运行
复制
public class MockitoInjectMocksTests {

    @Mock
    private OrderRepository orderRepository;
    private AutoCloseable closeable;
    @InjectMocks
    private OrderService orderService;

    @BeforeEach
    void initService() {
        closeable = MockitoAnnotations.openMocks(this);
    }

    @AfterEach
    void closeService() throws Exception {
        closeable.close();
    }

    @Test
    void createOrderSetsTheCreationDate() {
        Order order = new Order();
        when(orderRepository.save(any(Order.class))).then(returnsFirstArg());

        Order savedOrder = orderService.create(order);

        assertNotNull(savedOrder.getCreationDate());
    }
}

Mockito将首先尝试通过构造函数注入注入模拟,然后是setter注入或字段注入。

Pros:

容易注入模拟

Cons:

不强制使用构造函数注入

票数 7
EN

Stack Overflow用户

发布于 2021-09-28 16:33:32

对我来说,这里提到的解决办法都没有奏效。

mockito-core3.3.3更新到3.4.3解决了这个问题。

我认为造成这种情况的原因是,MockitoAnnotations.initMock()方法已被废弃,并已被Mockito JUnit 5版本3中的MockitoAnnotations.openMocks()所取代。

另一方面,可能值得检查本地Maven Repository并删除可能导致冲突的不必要的jars。但是,在应用此步骤时,请注意不要手动删除已安装的步骤(或在操作之前执行备份)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67432118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档