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
方法。没必要嘲笑。