首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JUnit _ MockServer _ RestTemplate

JUnit _ MockServer _ RestTemplate
EN

Stack Overflow用户
提问于 2020-06-05 09:41:06
回答 1查看 272关注 0票数 0

我有一个名为PostService的服务,它的实例变量名为connectionManager Autowired

在这个connectionManager中有一个实例变量,名为restTemplate Autowired.

在配置java文件中,用一定的逻辑创建RestTemplate的对象。

当我围绕一个测试用例编写测试用例时,创建一个带有预期的MockRestServiceServer和post方法的,作为回报,期望得到某个主体的响应。当我执行一个测试用例时,我不会得到来自这个mockedRestServiceServer**.**的模拟响应

同样,我可以感觉到,这是因为在测试执行期间,创建了一个真正的rest模板对象,并且没有使用模拟服务器发送模拟响应。

有人能帮我吗,怎么克服呢?

代码语言:javascript
复制
class PostServie {

    @Autowired
    private ConnectionManager connectionManager;

    public void postMessage(String msg) {
    // some logic
    }

}
代码语言:javascript
复制
@Component
class ConnectionManager {

    @Autowired
    private RestTemplate restTemplate;

    public String getToken(){
        ResponseEntity<String> response = this.restTemplate.postForEntity(url, request, String.class);
        //returns response.body() in string format
    }

}
代码语言:javascript
复制
@Configuration
class Configuration {

    @Bean
    public RestTemplate getRestTemplate(){
        // some logic and returns object of RestTemplate
    }

}
代码语言:javascript
复制
@RunWith(SpringRunner.class)
class PostServiceTest {

    @Autowired
    private PostMessageService postMessageService;

    @Resource(name="authServerRestTemplet")
    private RestTemplate authServerRestTemplet;

    private MockRestServiceServer mockedAuthServerRestTemplet;

    private final String requestToAuthServer ="grant_type=client_credentials&client_id=ceapiClientId";

   @Before
    public void setUp() { 

    mockedAuthServerRestTemplet = 
    MockRestServiceServer.createServer(authServerRestTemplet);

    }

  @Test 
   public void postServeiceSuccess () {

mockedAuthServerRestTemplet.expect(requestTo(ACCESS_TOKEN_URI)).andExpect(content().string(requestToAuthServer)).andExpect(method(HttpMethod.POST)).andRespond(withSuccess("{abc : 'abc'}", MediaType.APPLICATION_JSON));

   postMessageService.postMessage(jsonMessage);
   }
  }
}
EN

回答 1

Stack Overflow用户

发布于 2020-06-05 09:57:19

您正在创建一个RestTemplate实例,但不使用它。MockRestServiceServer在做什么?我还可以看到对@Resource@Autowired的错误使用,您不应该在测试中指定它们。尝试使用@MockBean

自动装配工作,以便您在测试中创建的资源被注入到实际的类中,而不是反过来。

我将在这里添加一些示例代码,这些代码可能会帮助您实现目标。

代码语言:javascript
复制
@RunWith(SpringRunner.class)
@WebMvcTest
public abstract class AbstractControllerTest {

    @Autowired
    protected MockMvc mockMvc;

    @MockBean
    protected Service service;

    @Before
    public void setUp() {
        Mockito.reset(service);
    }
}

然后你的测试

代码语言:javascript
复制
public class YourTest extends AbstractControllerTest {


@Test
public void shouldDoSomething() throws Exception {

    // given
    List<someStuff> stuff = new ArrayList<>();

    stuff.add(new Whatever("content", "John Smith");

    // when - service is in the abstract controller!
    when(service.getSomething()).thenReturn(stuff);

    // then
    mockMvc.perform(get("/posts/1/whatever").accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$[0].content", is("content")))
            .andExpect(jsonPath("$[0].author", is("John Smith"))));

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62212396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档