【问题标题】:JUnit | MockServer | RestTemplateJUnit |模拟服务器 |休息模板
【发布时间】:2020-06-05 09:41:06
【问题描述】:

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

connectionManager 内部有一个名为restTemplate Autowired. 的实例变量

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

当我围绕它编写一个测试用例,并创建一个带有预期 URL 和 post 方法的 MockRestServiceServer 时,作为回报,预期会有一些正文的响应。当我执行测试用例时,我没有收到来自 mockedRestServiceServer 的模拟响应。

我能感觉到,这是因为在测试执行期间,创建了一个真实的 rest 模板对象,并且模拟服务器不用于发送模拟响应。

谁能帮助我,如何克服这个问题?

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

【问题讨论】:

  • 你能添加测试用例并重新格式化问题,这样更清楚吗?这段代码真的很混乱。

标签: java spring junit resttemplate spy


【解决方案1】:

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

自动装配的作用是让您在测试中创建的资源被注入到真正的类中,而不是相反。

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

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

}

【讨论】:

  • 无法理解,能否请您使其更具描述性或再次查看我编辑的查询。
猜你喜欢
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
  • 2020-03-08
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
相关资源
最近更新 更多