TestRestTemplate没有检测到在SpringBootTest中被模拟的资源

时间:2017-03-15 12:48:29

标签: unit-testing spring-boot mocking mockito resttemplate

@RunWith(SpringJUnitRunner.class)    
@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOMPORT)   
class ResourceTest {
    @Autowired
    private TestRestTemplate testRestTemplate;

    @MockBean
    private AuthService authService; //This is used in the method being hit by the testRestTemplate.

    @Before
    public void setUp() extends Exception {
        given(this.authService.auth(user)).willReturn(user); //given mock object some behaviour
        //Some Code
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testAuthValidParameters() throws Exception {
        //Assume Every Parameter is appropriate
        HttpEntity<String> request = new HttpEntity<>(postBody,headers);
        //The Exception occurs here
        ResponseEntity<String> responseEntity = this.testRestTemplate.postForEntity("/path/auth/",request,String.class);
        //Some asserts and other tests
    }
}

例外情况如下

org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:53234/path/auth/"

当我没有模拟并让实际方法运行或直接使用Mock时,问题不会发生(看起来像普通模拟与PowerMock结合并不能实际影响被调用的方法)。它们被执行,这是集成测试,并没有解决问题。

因此,当我使用MockBean时,会出现此异常。可能是根本原因,我该如何解决呢。

编辑1:

使用几乎相同的代码并更改setUp中的模拟存根,如

when(authService.authenticate(any(User.class))).thenReturn(user);

我得到了一个Http Code 400.这是否意味着它正在击中服务器?这可能意味着它正在拿起MockBean,但根本没有改变的参数被拒绝。

1 个答案:

答案 0 :(得分:0)

您可以编写类似下面的内容,让您的模拟服务返回一些响应。

    User user= new User();
    user.setUserName("abc");
    user.setPassword("testPass");
    when(authService.authenticate(user)).thenReturn(user);

然后,您可以调用testRestTemplate并发布您的对象,并期望得到此响应。

定义Restassured端口:

@Value("${local.server.port}")
private int tomcatPort;

@Before
public void setup() {
    RestAssured.port = tomcatPort;
}