java - JUnit |模拟服务器|休息模板

标签 java spring junit resttemplate spy

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

在这个connectionManager内部有一个名为restTemplate Autowired的实例变量。

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

当我围绕它编写一个测试用例,并使用预期的 URL 和 post 方法创建一个 MockRestServiceServer 时,作为返回,期望得到带有某些正文的响应。当我执行测试用例时,我没有从这个 mockedRestServiceServer 得到模拟响应。

据我所知,这是因为在测试执行期间,创建了剩余模板的真实对象,并且模拟服务器不用于发送模拟响应。

有人可以帮助我,如何克服这个问题吗?

class PostServie {

    @Autowired
    private ConnectionManager connectionManager;

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

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

}
@Configuration
class Configuration {

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

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

最佳答案

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

Autowiring 的作用是将您在测试中创建的资源注入(inject)到真实的类中,而不是相反。

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

@RunWith(SpringRunner.class)
@WebMvcTest
public abstract class AbstractControllerTest {

    @Autowired
    protected MockMvc mockMvc;

    @MockBean
    protected Service service;

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

然后是你的测试

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"))));

}

关于java - JUnit |模拟服务器|休息模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62212396/

相关文章:

java - XML 序列的 JAXB 处理

java - Firebase 数据库路径 : 1. 0 无效。Firebase 数据库路径不得包含 '.' 、 '#' 、 '$' 、 '[' 或 ']'

java - EJB 本地调用出现错误目标异常

java.io.FileNotFoundException : http://localhost:8080/manager/text/list

java - Mockito:模拟一个操作输入数组参数的方法

java - 带 DB 的 Spring Boot 应用程序 - 使用 @DirtiesContext 重新创建上下文后测试类失败

java - 使用来自 java 的 Pyrolite 运行 python 脚本

java - 如何将@ConvertGroup与@GroupSequenceProvider一起使用

java - 如何在我的项目中正确配置 Spring Security?

Eclipse grails 作为 JUnit 测试运行