当前位置: 首页 > 知识库问答 >
问题:

如何在JavaSpring中模拟RestTemplate?

上官砚文
2023-03-14
public class ServiceTest {
    @Mock
    RestTemplate restTemplate = new RestTemplate();
    @InjectMocks
    Service service = new Service();
    ResponseEntity responseEntity = mock(ResponseEntity.class);

    @Test
    public void test() throws Exception {
        Mockito.when(restTemplate.getForEntity(
                Mockito.anyString(),
                Matchers.any(Class.class)
                ))
                .thenReturn(responseEntity);
        boolean res = service.isEnabled("something");
        Assert.assertEquals(res, false);
    }

我尝试对一个包含restclient的服务进行一个简单的测试。看来我没有成功地模仿restmplate。看起来代码得到的是真实数据,而不是模拟数据。任何人都可以帮我。

服务本身将如下所示:

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;
    }
}

共有3个答案

诸葛文博
2023-03-14

如果使用@Autowired,则可以使用MockRestServiceServer。下面是示例。

@Service
public class Service{
    @Autowired
    private RestTemplate restTemplate;

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

@服务需要使用@Autowired自动创建对象。

贝滨海
2023-03-14

SpringMVC的测试框架为单元测试RESTful服务代码提供了类MockRestServiceServer

这里有一个关于它使用的教程。

丌官瀚
2023-03-14

问题是,在您的isEn的中,您正在创建一个新的RestTemboard。这是错误的,有两个原因,一个是您不能嘲笑它,因为您正在创建一个新的对象,第二,避免每个请求创建新对象是好的。RestTem板是线程安全的,因此可以是服务类成员,跨许多线程使用。

将您的服务类别更改为以下内容:

public class Service{

    RestTemplate restTemplate = new RestTemplate();

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

现在,您的RestTem板已成为类成员,您现在可以通过两种方式之一正确地模拟。第一,使用@InjectMock注入它,或者使用从测试中调用的setter方法。

因为您在代码中使用了InjectMock,所以我们可以使用它。

@RunWith(MockitoJUnitRunner.class) 
public class ServiceTest {
    @Mock
    RestTemplate restTemplate;
    @InjectMocks
    @Spy
    Service service;
    ResponseEntity responseEntity = mock(ResponseEntity.class);

    @Test
    public void test() throws Exception {
        Mockito.when(restTemplate.getForEntity(
                Mockito.anyString(),
                ArgumentMatchers.any(Class.class)
                ))
                .thenReturn(responseEntity);
        boolean res = service.isEnabled("something");
        Assert.assertEquals(res, false);
    }

注意,我做了一些更改。首先,我删除了新RestTemplate()新服务()。你应该让mockito为你创建这些。通过使用@Mock@Spy对它们进行注释,您将确保Mockito将为您创建它们,更重要的是,将Mock注入您的服务对象。

 类似资料:
  • 我知道Dan North设计BDD的意图之一是将词汇表从复杂的测试域中移开。然而,在实现由外到内的方法时,我们似乎仍然需要对模仿行为(或者,如果您愿意的话)有一些了解。North在这个视频中建议,如果我从最外层的域对象开始,然后向内工作,我会在发现合作者时模仿它们,然后用适当的实现替换它们。所以最后,我以一组端到端测试结束。 Martin Fowler在这篇博客文章中定义了TDD的两个阵营:“古典

  • 问题内容: 我尝试了这个: 但是碰巧 即使:par1不为null,也总是返回表的所有行。 而 不返回任何行。 我不能使用本机语法,因为我的应用程序应该在不同的数据库引擎上运行 问题答案: HQL中的命令等效于该命令。 如果不为null,则返回,否则返回。 因此,您需要以下方面的东西:

  • 问题内容: 大多数关系数据库都有某种字符串函数,例如: 会屈服 另一方面,SQLite具有非常有限的功能集。SQLite支持的功能在此处列出: http://www.sqlite.org/lang_corefunc.html 可以使用SQLite中可用的功能进行仿真吗? 问题答案: 我的答案结合了Shiplu Mokaddim的 “printf字符替换重复”和Steve Broberg和[Luka

  • 是模拟抽象类:,而是接口。这是失败点: 如何模拟这段代码?

  • 我有一种方法可以将文件上传到Amazon S3。我正在尝试为此方法编写JUnit,但在S3AsyncClient上获取NullPointerException: 我的班级: S3UploadData类对象的输入:` @Getter@allargsconstuctor 你能帮我写Junit for uploadFile方法吗?

  • 我试图使用下面的代码模拟方法,但我得到了异常,而且我是单元测试的新手