Spring 5 REST测试WebTestClient为null

时间:2018-04-18 10:55:41

标签: rest unit-testing spring-boot

我正在尝试学习如何在SpringBoot中测试REST。我已经从https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html重写了代码,并根据我的需要进行了一些更改,但我的testClient变量始终为空。我试图手动实例化,例如使用这个:

WebTestClient testClient = WebTestClient
  .bindToServer()
  .baseUrl("http://localhost:8080")
  .build();

或通过使用ApplicationContext构建它:

@Autowired
private ApplicationContext context;

WebTestClient testClient = WebTestClient.bindToApplicationContext(context)
  .build();

没有任何作用,但是当我尝试使用ApplicationContext方式时,我的堆栈跟踪说" ApplicationContext是必需的"。

这就是我的代码现在的样子:

@AutoConfigureWebTestClient
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@RunWith(SpringRunner.class)
class BusinessProcessControllerTest {

    @Autowired
    private WebTestClient testClient;

    @Test
    public void returns_type_JSON(){
        testClient.get().uri("/businessProcess").accept(MediaType.APPLICATION_JSON);
    }

在Spring教程中,他们甚至没有使用@AutoConfigureWebTestClient,但如果我没有将其添加到代码中,它将无法工作。还有什么可以遗漏?在这个版本中,我一直得到NullPointerException - 调试器说testClient为空。如何让它工作,以便进一步测试写作?

1 个答案:

答案 0 :(得分:0)

我没有解决这个问题,而是使用了另一个类。我对此不太满意,但是它可以正常工作,所以这是我在本课中使用的:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
@Transactional
public class BusinessProcessControllerTest {

    @Autowired
    private MockMvc mockMvc;

我使用MockMvc对象执行如下HTTP方法:

@Test
    public void businessProcessSetImportanceReturns201ForExistingResource() throws Exception {
        this.mockMvc.perform(postAsAdmin("/businessProcesses/2/setImportance")).andExpect(status().isCreated());
    }

其中“ postAsAdmin”方法是我自己的实现,下面是其工作原理:

public static MockHttpServletRequestBuilder postAsAdmin(String urlTemplate, Object... uriVars) {
        return MockMvcRequestBuilders.post(urlTemplate, uriVars).with(httpBasic(ADMIN_USERNAME, PASSWORD));
    }