嗨,在使用 Java 监视服务的 Spring 引导服务编写集成测试时遇到了一些问题。
首先,我需要我的Spring bean在启动时运行,所以已经实现了ApplicationRunner接口。 然后,我将监视服务设置为使用 take(( 方法轮询事件。 这将阻止,直到收到事件。 我遇到的问题是,无论我在集成测试中做什么,测试都不会被执行,因为它似乎在 watcher.take(( 方法上阻塞
@Component
public class MyClass implements ApplicationRunner {
private static Boolean shutdown;
private WatchService watcher;
@Value("${file.location}")
private String fileLocation;
@Override
public void run(ApplicationArguments args) {
Path myDir = Paths.get(fileLocation);
try {
watcher = myDir.getFileSystem().newWatchService();
myDir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE);
while(true) {
WatchKey watchKey = watcher.take();
List<WatchEvent<?>> events = watchKey.pollEvents();
for (WatchEvent event : events) {
if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
//dosomething
}
}
watchKey.reset();
}
}
}
我下面的集成测试类似乎从未执行过测试的第一行? 它只是转到我主类的运行方法。 还可以更改我的文件的值在我的集成测试中注入的值吗?
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestIT {
@Test
public void testFileGetsPickedUpAndProcessed() throws IOException, InterruptedException{
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("pickMe.txt").getFile());
file.renameTo(new File("/tmp/pickMe.txt"));
//some assertions
}
watcher.take(( 是一个阻塞方法。 请务必在另一个线程中运行代码以运行测试。
我的应用程序遇到了同样的问题。此代码工作并处理创建/修改事件:
while(true) {
WatchKey watchKey = watcher.take();
List<WatchEvent<?>> events = watchKey.pollEvents();
for (WatchEvent event : events) {
if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
handleNewFileCreated(event);
} else if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY) {
handleFileModified(event);
}
}
watchKey.reset();
// Wait a moment
Thread.sleep(1000);
}
并添加睡眠,永远不要让">while(true(">
问候