Java 我在junit mockito中使用Optional.of时遇到了找不到的错误

Java 我在junit mockito中使用Optional.of时遇到了找不到的错误,java,spring,spring-boot,junit,mockito,Java,Spring,Spring Boot,Junit,Mockito,我试图在junit mockito中实现一个简单的测试,以从数据库中获取记录。 这是我的测试课: @ExtendWith(MockitoExtension.class) class AddressControllerTest { @Mock AddressRepository addressRepository; @InjectMocks AddressServiceImpl addressServiceImpl; @Test void

我试图在junit mockito中实现一个简单的测试,以从数据库中获取记录。 这是我的测试课:

@ExtendWith(MockitoExtension.class)
class AddressControllerTest {



    @Mock
    AddressRepository addressRepository;

    @InjectMocks
    AddressServiceImpl addressServiceImpl;


    @Test
    void findByIdTest(){
        Address myAddress = new Address();
        when(addressRepository.findById(12)).thenReturn(Optional.of(myAddress));

        Address theAddress = addressServiceImpl.findById(12);
        assertNotNull(theAddress);
    }
}
但我得到了这个错误信息: “找不到适用于thenReturn的方法(java.util.Optional)”

如果我删除“Optional.of”并仅使用该对象,则不会出现任何错误

我的问题是:

  • 为什么我会犯那个错误
  • Optional.of真正起什么作用?换句话说,使用或不使用Optional.of有什么区别? 我问了第二个问题,因为我看不到使用Optional.of的结果
以下是我的pom.xml:

<properties>
            <java.version>1.11</java.version>
            <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
            <junit-platform.version>5.7.0</junit-platform.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-security</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.thymeleaf.extras</groupId>
                <artifactId>thymeleaf-extras-springsecurity5</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <scope>runtime</scope>
            </dependency>
    
            <dependency>
                <groupId>org.postgresql</groupId>
                <artifactId>postgresql</artifactId>
                <scope>runtime</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-aop</artifactId>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter-api</artifactId>
                <version>${junit-platform.version}</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.junit.platform</groupId>
                <artifactId>junit-platform-commons</artifactId>
                <version>1.7.0</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter-engine</artifactId>
                <version>${junit-platform.version}</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-core</artifactId>
                <version>3.6.0</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-junit-jupiter</artifactId>
                <version>3.6.0</version>
                <scope>test</scope>
            </dependency>
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>

1.11
3.1.1
5.7.0
org.springframework.boot
spring引导启动器数据jpa
org.springframework.boot
弹簧启动安全
org.springframework.boot
弹簧启动装置
org.thymeleaf.extras
thymeleaf-extras-springsecurity5
org.springframework.boot
SpringBootStarterWeb
mysql
mysql连接器java
运行时
org.postgresql
postgresql
运行时
org.springframework.boot
弹簧靴开发工具
运行时
org.springframework.boot
弹簧启动机aop
朱尼特
朱尼特
测验
org.junit.jupiter
JUnitJupiter api
${junit platform.version}
测验
org.junit.platform
junit平台共享
1.7.0
测验
org.junit.jupiter
朱尼特木星发动机
${junit platform.version}
测验
org.mockito
莫基托磁芯
3.6.0
测验
org.mockito
莫基托朱庇特酒店
3.6.0
测验
org.springframework.boot
springbootmaven插件
为什么我会犯那个错误

您正试图在此处模拟
addressRepository.findById(12)
。调用
addressRepository.findById(12)
时,您是说它应该返回
Optional.of(myAddress)
。问题是,它不可能返回
可选的.of(myAddress)
,这是一个
可选的
findById
似乎被声明为返回
地址
,而不是
可选

当您删除的
Optional.of时,您告诉它只返回
myAddress
,它当然可以这样做
myAddress
属于
Address
类型,并且
findById
被声明为返回
地址

就所涉及的类型而言,
when
接受一个
T
并返回一个
ongoingstubing
,它有一个名为
thenReturn
的方法,该方法接受一个
T
。由于您在
时将
地址
传递到
中,
T
被推断为
地址
,因此
然后返回
也会获取一个
地址

使用或不使用Optional.of有什么区别


如您所见,使用
Optional.of
会产生错误,而不使用则不会。在这里使用
Optional是没有意义的,除非
findById
被声明为返回
Optional

如果您的配置有问题,我将执行类似的测试并得到正确的响应。你能分享你的配置吗

地址存储库
@存储库
公共接口地址存储库扩展了Crudepository{
}
AddressServiceImpl
@服务
@所需参数构造函数
公共类AddressServiceImpl实现AddressService{
专用最终地址存储库地址存储库;
公共地址findById(最终整数id){
return addressRepository.findById(id.get();
}
}
pom.xml

org.springframework.boot
SpringBootStarterWeb
org.springframework.boot
spring引导启动器数据jpa
org.projectlombok
龙目
org.springframework.boot
弹簧起动试验
测验
org.junit.vintage
朱尼特老式发动机
Trie将使用:
when(addressRepository.findById(Mockito.eq(12))).thenReturn(可选的.of(myAddress));
相反:
when(addressRepository.findById(12)).thenReturn(可选的.of(myAddress));

谢谢。我在我的问题中添加了pom.xml,但我认为这不是配置问题,因为当我使用any()而不是“12”作为请求的id时,一切都运行良好。trie在when实现中使用Mockito.eq(12)而不是12(我已经在这篇评论中添加了示例)。