无法使用@SpringBootTest执行控制器测试

问题描述

我有一个Spring Boot应用程序。版本为for num in listA: if num == listA[listA_i]: listB.append(num)

主应用程序如下:

2.3.1

启动应用程序后,我必须执行3个不同的步骤,分别用@AllArgsConstructor @SpringBootApplication public class LocalServiceApplication implements CommandLineRunner { private final DataService dataService; private final QrReaderServer qrReaderServer; private final MonitoringService monitoringService; @Override public void run(String... args) { dataService.fetchData(); monitoringService.launchMonitoring(); qrReaderServer.launchServer(); } public static void main(String[] args) { SpringApplication.run(LocalServiceApplication.class,args); } } 完成:

我有一个像这样的控制器

CommandLineRunner

使用Junit 5进行的蚂蚁测试看起来像:

@Slf4j
@RestController
@AllArgsConstructor
@RequestMapping("/v1/permissions")
public class CarParkController {
    private final PermissionService permissionService;

    @PostMapping
    public CarParkPermission createPermission(@RequestBody @Valid CarParkPermission permission) {
        return permissionService.createPermission(permission);
    }
}

看起来应该可以正常工作。

但是,测试未执行:

@ActiveProfiles("test")
@AutoConfiguremockmvc
@SpringBoottest(webEnvironment = SpringBoottest.WebEnvironment.DEFINED_PORT)
class CarParkControllerIntegrationTest {
    @Autowired
    private mockmvc mockmvc;
    @MockBean
    private PermissionService permissionService;
    private final Gson gson = new Gson();

    @Test
    void testCreatingNewPermissionSuccess() throws Exception {
        CarParkPermission permission = CarParkPermission.builder()
                .id(56)
                .permissionCode("1234")
                .build();

        when(permissionService.createPermission(refEq(permission))).thenReturn(permission);

        postPermission(permission).andExpect(status().isOk());
    }

    private <T> ResultActions postPermission(T instance) throws Exception {
        return this.mockmvc.perform(post("/v1/permissions")
                .contentType(MediaType.APPLICATION_JSON)
                .content(gson.toJson(instance)));
    }
}

这些行的执行永远挂掉。

更新

以下是监视任务的详细信息:

2020-08-27 14:42:30.308  INFO 21800 --- [           main] c.s.i.CarParkControllerIntegrationTest   : Started CarParkControllerIntegrationTest in 8.593 seconds (JVM running for 10.03)
2020-08-27 14:42:30.334  INFO 21800 --- [           main] c.s.s.s.DataServiceTestImpl     : Fetch data for test profile is skipped
2020-08-27 14:42:30.336 DEBUG 21800 --- [   carpark-ex-1] c.s.monitoring.MonitoringServiceImpl     : START_MONITORING Results from Cameras for folder: D:\results-from-camera
2020-08-27 14:42:30.751 DEBUG 21800 --- [           main] c.s.netty.Tcpserver              : TCP Server is STARTED : port 9090

@Async @Override public void launchMonitoring() { log.debug("START_MONITORING Results from Cameras for folder: {}",properties.getFolder()); try { WatchKey key; while ((key = watchService.take()) != null) { for (WatchEvent<?> event : key.pollEvents()) { WatchEvent.Kind<?> kind = event.kind(); if (kind == ENTRY_CREATE) { log.info("FILE_CREATED: {}",event.context()); // processing resource deleteResource(zipFullPath); } else if (kind == ENTRY_DELETE) { log.info("RESOURCE_DELETED: {}",event.context()); } } key.reset(); } } catch (InterruptedException e) { log.error("interrupted exception for monitoring service",e); Thread.currentThread().interrupt(); } } 也配置了TaskExecutor。

Tcpserver的启动方法如下:

AsyncConfiguration

如何解决此问题?

解决方法

已了解执行被阻止(感谢M.Deinum)。

因此将以下方法更改为:

@Async
@Override
public void launchServer() { 
    // ...
}

并转换为ObjectMapper而不是Gson来将实例转换为 JSON 格式:

@SpringBootTest
@AutoConfigureMockMvc
@ActiveProfiles("test")
class CarParkControllerIntegrationTest {
    @Autowired
    private MockMvc mockMvc;
    @Autowired
    private ObjectMapper mapper;

    @Test
    void testCreatingNewPermissionSuccess() throws Exception {
        CarParkPermission permission = CarParkPermission.builder()
                .id(444)
                .permissionCode("1234")
                .build();
        postPermission(permission).andExpect(status().isOk());
    }

    private <T> ResultActions postPermission(T instance) throws Exception {
        return this.mockMvc.perform(post("/v1/permissions")
                .contentType(MediaType.APPLICATION_JSON)
                .content(mapper.writeValueAsString(instance)));
    }
}

最后,它工作正常。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...