@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,但根本没有改变的参数被拒绝。
答案 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;
}