Spring boot 模拟LocalDate.now()和LocalTime.now()用于测试范围
我需要在测试类中模拟两个静态方法Spring boot 模拟LocalDate.now()和LocalTime.now()用于测试范围,spring-boot,powermock,localdate,localdatetime,Spring Boot,Powermock,Localdate,Localdatetime,我需要在测试类中模拟两个静态方法LocalDate.now()和LocalTime.now() 我正在使用PowerMock,但在尝试运行测试时收到此错误: org.springframework.beans.beans实例化异常:未能实例化[org.springframework.web.client.RestTemplate]:构造函数引发异常;嵌套异常为java.lang.NoClassDefFoundError:无法初始化类javax.xml.transform.FactoryFinde
LocalDate.now()
和LocalTime.now()
我正在使用PowerMock,但在尝试运行测试时收到此错误:
org.springframework.beans.beans实例化异常:未能实例化[org.springframework.web.client.RestTemplate]:构造函数引发异常;嵌套异常为java.lang.NoClassDefFoundError:无法初始化类javax.xml.transform.FactoryFinder
我试图在测试类和配置类中创建restemplate.class的@Bean,但错误仍然存在
只有在使用PowerMockRunner.class
运行测试时,才会出现此错误。如果我尝试使用SpringRunner.class
运行它,一切都很好,但我不能模拟LocalDate和LocalTime
这是我的测试课:
@PrepareForTest(LocalDate.class)
@RunWith(PowerMockRunner.class)
@SpringBootTest(webEnvironment = RANDOM_PORT, classes = ChallengeApplication.class)
@ActiveProfiles("test")
public class MockTest {
@Autowired
private TestRestTemplate restTemplate;
private URL base;
@LocalServerPort
int port;
User user = new User("user", "password", "user@test.com");
HttpEntity<User> userRequest = new HttpEntity<>(user);
Mock mock = new Mock(new BigDecimal(20));
HttpEntity<Mock> request = new HttpEntity<>(mock );
@Before
public void setUp() throws MalformedURLException {
restTemplate = new TestRestTemplate();
base = new URL("http://localhost:" + port + "/mock/users");
restTemplate.postForEntity(base.toString(), userRequest, String.class);
restTemplate = new TestRestTemplate(user.getUsername(), user.getPassword());
base = new URL("http://localhost:" + port + "/mock/mocks");
}
@Test
public void wrongUserAuth_ThenFailed() throws IllegalStateException {
restTemplate = new TestRestTemplate("test", "test");
ResponseEntity<String> response = restTemplate.postForEntity(base.toString(), request, String.class);
assertEquals(HttpStatus.UNAUTHORIZED, response.getStatusCode());
}
@Test
public void createTwoAccountsForTheSameUser_ThenFailed() throws IllegalStateException {
restTemplate.postForEntity(base.toString(), request, String.class);
ResponseEntity<String> responseTwo = restTemplate.postForEntity(base.toString(), request, String.class);
assertEquals(HttpStatus.CONFLICT, responseTwo.getStatusCode());
assertTrue(responseTwo
.getBody()
.contains("mock"));
}
@Test
public void createAccountDuringWeekend_ThenFailed() throws IllegalStateException {
LocalDate date = LocalDate.of(2000, 1, 1);
PowerMockito.stub(PowerMockito.method(LocalDate.class,"now")).toReturn(date);
ResponseEntity<String> response = restTemplate.postForEntity(base.toString(), request, String.class);
assertEquals(HttpStatus.CONFLICT, response.getStatusCode());
assertTrue(response
.getBody()
.contains("mock"));
}
}
@PrepareForTest(LocalDate.class)
@RunWith(PowerMockRunner.class)
@SpringBootTest(webEnvironment=RANDOM_PORT,classes=ChallengeApplication.class)
@ActiveProfiles(“测试”)
公共类模拟测试{
@自动连线
私有TestRestTemplate;
专用URL库;
@本地服务器端口
国际港口;
用户用户=新用户(“用户”、“密码”user@test.com");
HttpEntity userRequest=新的HttpEntity(用户);
Mock Mock=新的Mock(新的BigDecimal(20));
HttpEntity请求=新的HttpEntity(模拟);
@以前
public void setUp()引发畸形的DurException{
restTemplate=新的TestRestTemplate();
base=新URL(“http://localhost:“+端口+”/mock/users”);
postForEntity(base.toString(),userRequest,String.class);
restTemplate=新的TestRestTemplate(user.getUsername(),user.getPassword());
base=新URL(“http://localhost:“+端口+”/mock/mocks”);
}
@试验
public void ErrorUserAuth\u ThenFailed()引发非法状态异常{
restTemplate=新的TestRestTemplate(“测试”、“测试”);
ResponseEntity response=restTemplate.postForEntity(base.toString(),request,String.class);
assertEquals(HttpStatus.UNAUTHORIZED,response.getStatusCode());
}
@试验
public void createTwoAccountsForTheSameUser\u ThenFailed()引发非法状态异常{
postForEntity(base.toString(),request,String.class);
ResponseEntity responseTwo=restTemplate.postForEntity(base.toString(),request,String.class);
assertEquals(HttpStatus.CONFLICT,responseTo.getStatusCode());
资产真实(ResponseVo)
.getBody()
。包含(“模拟”);
}
@试验
public void createAccountDuringWeekend\u ThenFailed()引发非法状态异常{
LocalDate=LocalDate.of(2000,1,1);
stub(PowerMockito.method(LocalDate.class,“now”).toReturn(date);
ResponseEntity response=restTemplate.postForEntity(base.toString(),request,String.class);
assertEquals(HttpStatus.CONFLICT,response.getStatusCode());
assertTrue(响应
.getBody()
。包含(“模拟”);
}
}
你为什么要嘲笑这些?我怀疑它不需要太多的技巧就可以实现(一般来说,当沿着这条路走下去,模拟java类或静态时,您的设计IMHO中出现了一些错误)。我需要模拟它,因为我想返回与LocalDate.now()不同的日期。例如,当我调用我的implementation on LocaDate.now()以返回09.07.2020时,我希望返回05.02.2020。问题似乎不是模仿LocalDate.now()(或者通常是静态方法);问题是引入powermock会导致您的测试失败,因为上面提到的类初始化错误。事实上,这似乎是问题所在,实际上我不明白原因和根源。引入一个时钟,在测试中使用一个静态时钟,并使用使用java.time.clock
的now
方法。没必要嘲笑,你为什么要嘲笑那些?我怀疑它不需要太多的技巧就可以实现(一般来说,当沿着这条路走下去,模拟java类或静态时,您的设计IMHO中出现了一些错误)。我需要模拟它,因为我想返回与LocalDate.now()不同的日期。例如,当我调用我的implementation on LocaDate.now()以返回09.07.2020时,我希望返回05.02.2020。问题似乎不是模仿LocalDate.now()(或者通常是静态方法);问题是引入powermock会导致您的测试失败,因为上面提到的类初始化错误。事实上,这似乎是问题所在,实际上我不明白原因和根源。引入一个时钟,在测试中使用一个静态时钟,并使用使用java.time.clock
的now
方法。没必要嘲笑。