gpt4 book ai didi

java - 无法在 Spring Boot-Junit 5-Mockito 中模拟 RestTemplate

转载 作者:行者123 更新时间:2023-11-30 05:47:34 26 4
gpt4 key购买 nike

我试图在我的 DAO 类中模拟其余模板,但 Mockito 抛出奇怪的错误,说它无法模拟。

尝试涵盖我的 Spring boot 应用程序版本 2.x 的单元测试用例。我几乎尝试了互联网上所有可能的解决方案,例如更新 JDK/JRE 进行编译,但我遇到了以下错误:

org.mockito.exceptions.base.MockitoException: 
Mockito cannot mock this class: class org.springframework.web.client.RestTemplate.

Mockito can only mock non-private & non-final classes.
If you're not sure why you're getting this error, please report to the mailing list.


Java : 1.8
JVM vendor name : Oracle Corporation
JVM vendor version : 25.181-b13
JVM name : Java HotSpot(TM) 64-Bit Server VM
JVM version : 1.8.0_181-b13
JVM info : mixed mode
OS name : Windows 10
OS version : 10.0


Underlying exception : java.lang.IllegalArgumentException: Could not create type
at org.mockito.junit.jupiter.MockitoExtension.beforeEach(MockitoExtension.java:115)
....

以下是我的代码:

构建.gradle

dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-data-rest'
implementation 'org.springframework.retry:spring-retry'
implementation 'org.aspectj:aspectjrt'
implementation 'org.aspectj:aspectjweaver'
implementation 'org.springframework:spring-aop'
testImplementation 'org.springframework.boot:spring-boot-starter-test'

testImplementation 'org.junit.jupiter:junit-jupiter-api:5.2.0'
testCompile 'org.junit.jupiter:junit-jupiter-params:5.2.0'
testRuntime 'org.junit.jupiter:junit-jupiter-engine:5.2.0'
testImplementation 'org.mockito:mockito-core:2.+'
testImplementation 'org.mockito:mockito-junit-jupiter:2.18.3'
}

test {
testLogging.showStandardStreams = true
useJUnitPlatform()
}

MyDao.java

@Repository
public class MyDao {
@Value("${app.prop.service.url}")
private String url;

@Autowired
public RestTemplate restTemplate;

public String getSignals() {
System.out.println("url -----------------------> " + url);
return new RetryTemplate().execute(context -> {
ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);

if (response.getStatusCodeValue() == 200) {
System.out.println("Server response -> " + response.getBody());
return response.getBody();
} else {
throw new RuntimeException("server response status: " + response.getStatusCode());
}
}, context -> {
System.out.println("retry count: " + context.getRetryCount());
System.err.println("error -> " + context.getLastThrowable());
return null;
});
}
}

MyDaoTest.java

@ExtendWith(MockitoExtension.class)
public class MyDaoTest {
@Mock
private RestTemplate restTemplate;

@InjectMocks
private MyDao dao;

@BeforeEach
public void prepare() {
ResponseEntity<String> response = new ResponseEntity<>("{name: myname}", HttpStatus.OK);
Mockito.doReturn(response).when(restTemplate.getForEntity(Mockito.anyString(), String.class));
}

@Test
public void testGetSignals() {
System.out.println("------------------TEST-------------------");
String result = dao.getSignals();
System.out.println("result ------>" + result);
assertEquals("{name: myname}", result);
}
}

RestTemplate 的 BeanConfig

@Bean
public RestTemplate restTemplate() {
// block of code for SSL config for HTTPS connection
return new RestTemplate();
}

任何建议都会非常有帮助

P.S:应用程序通过 gradle 命令运行得很好

gradlew bootRun

问题仅在于单元测试

gradlew test

最佳答案

这个问题发生在我身上,因为我无意中运行了 Java 11。当我切换到项目标准的 Java 8 后,问题就消失了。

关于java - 无法在 Spring Boot-Junit 5-Mockito 中模拟 RestTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54579940/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com