@SuppressWarnings("serial") @Test public void testAsyncReferenceDynamicLookup() throws InterruptedException, ExecutionException { BlockingFoo.reset(); BlockingBarProducer.reset(); Boss.DESTROYED.set(false); List<Boolean> stageResults = new CopyOnWriteArrayList<>(); AsyncReference<Boss> ref = weld.select(new TypeLiteral<AsyncReference<Boss>>() { }).get(); ref.thenAccept((boss) -> stageResults.add(true)); assertEquals(0, stageResults.size()); Awaitility.await().atMost(Timeouts.DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS).until(() -> ref.isDone()); BlockingFoo.complete("Foo"); BlockingBarProducer.complete(152); Awaitility.await().atMost(Timeouts.DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS).until(() -> ref.get().isReadyToTest()); assertEquals(1, stageResults.size()); ref.whenComplete((r, t) -> { if (r != null) stageResults.add(true); }); assertEquals(2, stageResults.size()); assertEquals(152, ref.get().juicyBar.get().code); weld.destroy(ref); assertTrue(Boss.DESTROYED.get()); }