如何使用MockRestServiceserver模拟RESTTEMPLATE


@RunWith(MockitoJUnitRunner.class)
public class FeatureFlipperManagerTest {
    @Autowired
    RestTemplate restTemplate = new RestTemplate();
    @Autowired
    Service service = new Service();
    MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate);
    @Test
    public void test() throws Exception {
      mockServer.expect(requestTo(Mockito.anyString()))
                .andRespond(withSuccess("{"enabled":true}", MediaType.APPLICATION_JSON));
        boolean res = service.isEnabled("xxx");
        mockServer.verify();
        Assert.assertEquals(true, res);
    }
}

我有一个oberrestserviceserver可以在服务中模拟resttemplete。但是它总是失败。它显示错误为java.lang.AssertionError: Further request(s) expected 0 out of 1 were executed。任何人都可以让我知道我在哪里做对的地方。

服务本身将看起来像这样:

public class Service{
    public boolean isEnabled(String xxx) {
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> response = restTemplate.getForEntity("someurl",String.class);
        if(...)return true;
        return false;
    }
}

首先,您的 Service类在每个请求上创建一个新的rettemplate实例。我不能足够强调它的糟糕态度。创建一个类型RESTTEMPLATE的豆并将其注入您的Service bean(它很可能已经创建 - 取决于您使用的Spring MVC版本)。

一旦您拥有它,则两个rettemplates: Service bean中的一个和一个注入FeatureFlipperManagerTest中的一个将是相同的,并且可以对MockRestServiceServer进行测试。

编辑 - 更加明确:

将您的Service类修改为:

@Component
public class Service {
    private RestTemplate restTemplate;  
    @Autowired 
    public Service(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }
    public boolean isEnabled(String xxx) {
        ResponseEntity<String> response = restTemplate.getForEntity("someurl",String.class);
        if(...)return true;
        return false;
    }
}

和您的测试课程:

@RunWith(MockitoJUnitRunner.class)
public class FeatureFlipperManagerTest {
    @Autowired
    RestTemplate restTemplate;
    @Autowired
    Service service;
    MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate);
    @Test
    public void test() throws Exception {
      mockServer.expect(requestTo(Mockito.anyString()))
                .andRespond(withSuccess("{"enabled":true}", MediaType.APPLICATION_JSON));
        boolean res = service.isEnabled("xxx");
        mockServer.verify();
        Assert.assertEquals(true, res);
    }
}

如果这失败了,例外说没有 RestTemplate bean,则请粘贴有关Spring(Spring Boot?)版本的信息。

这不是您问题的答案,但以防万一任何人在2021年遇到这个问题……在春季启动测试中,您可能需要利用仅使用测试其余部分@RestClientTest。这仅在默认情况下创建RestTemplateBuilder BEAN,如果您想要自动连接的RestTemplate,只需添加一点点配置。(示例是在Kotlin中,而是使用Java作为对读者的锻炼。)

@AutoConfigureWebClient(registerRestTemplate = true)
@RestClientTest(Service::class)
class AdkClientTest @Autowired constructor(
    private val mockRestServiceServer: MockRestServiceServer,
    private val service: Service
) {
    // …
}

我认为您的意思是您要使用Spring提供的RESTTEMPLATE,因此您应该在Spring自动进行RESTTEMPLATE后创建createServer。我认为您可以这样做:

@RunWith(MockitoJUnitRunner.class)
public class FeatureFlipperManagerTest {
    @Autowired
    RestTemplate restTemplate;
    Service service;
    MockRestServiceServer mockServer;
    @Before
    public void init() {
        service = new Service(); 
        service.setRestTemplate(restTemplate);
        // If you have autowired restTemplate in Service, you can just autowired the service
        mockServer = MockRestServiceServer.createServer(restTemplate);
    }
    @Test
    public void test() throws Exception {
      mockServer.expect(requestTo(Mockito.anyString()))
                .andRespond(withSuccess("{"enabled":true}", MediaType.APPLICATION_JSON));
        boolean res = service.isEnabled("xxx");
        mockServer.verify();
        Assert.assertEquals(true, res);
    }
}

相关内容

  • 没有找到相关文章

最新更新