Java 可供选择的未来行为似乎是;“破碎的”;从Powermock测试执行时

Java 可供选择的未来行为似乎是;“破碎的”;从Powermock测试执行时,java,guava,easymock,jdeveloper,powermock,Java,Guava,Easymock,Jdeveloper,Powermock,基于,我正在使用ListenableFuture 我正在使用: java 1.6 JDeveloper 11.1.1.6.0 番石榴-13.0.1.jar junit-4.5.jar easymock-3.1.jar powermock-easymock-1.4.12-full.jar 我试图确保在异步模式下调用被测试的方法 My Manager.java代码是: 任何想法都将受到欢迎!:) 谢谢 我不确定我是否理解您为什么想在测试代码中睡觉。测试应该快速运行。您从未看到您的“done as

基于,我正在使用ListenableFuture

我正在使用:
java 1.6
JDeveloper 11.1.1.6.0
番石榴-13.0.1.jar
junit-4.5.jar
easymock-3.1.jar
powermock-easymock-1.4.12-full.jar

我试图确保在异步模式下调用被测试的方法

My Manager.java代码是:

任何想法都将受到欢迎!:)

谢谢

我不确定我是否理解您为什么想在测试代码中睡觉。测试应该快速运行。您从未看到您的
“done async”
日志消息吗?@LouisWasserman:我想确保操作是在“async”模式下完成的-这意味着,我不想等待睡眠完成。我只想调用我的方法
MyCacheManager.getDetails(…)
,我的测试将退出
refreshAsync()
方法。此时,我将知道睡眠是在“并行”线程中完成的,并且不会阻止我的主测试=>test在超时之前完成。但如果测试在超时时失败-我知道线程正在以“同步”方式休眠,只有在完成后我才会从refreshAsync()返回。此外,在实际测试中,我会将超时时间减少到1秒左右-这足以完成“同步”方法,若测试并没有完成,那个么不管日志睡眠时间有多长。@BrianHenry:我确实看到了这条消息,但在“等待5秒结束”之后。所以我认为测试是在“同步”模式下运行的。
    ...

    public synchronized void   refreshAsync(final String id) {
    m_Log.entry(id);

    ListeningExecutorService service =
        MoreExecutors.listeningDecorator(Executors.newCachedThreadPool());

    ListenableFuture<Details> getDetailsTask =
        service.submit(new Callable<Details>() {
            @Override
            public Details call() {
                System.out.println(Thread.currentThread().toString());
                return MyCacheManager.getDetails(id);
            }
        });

    Futures.addCallback(getDetailsTask ,
                        new FutureCallback<Details>() {
            // we want this handler to run immediately after we push the big red button!

            public void onSuccess(Details details) {
                System.out.println("Success");
                //TODO: publish event
            }

            public void onFailure(Throwable thrown) {
                System.out.println("Failed");
                //TODO: log
            }
        });

    service.shutdown();

    m_Log.exit("done async");
}

...
    @RunWith(PowerMockRunner.class)
    @PrepareForTest( { Manager.class,  MyCacheManager.class, TWResourceManager.class, Logger.class })
    public class DetailsTests {
    {

        ...

        @Test (timeout = 4000) 
        public void refreshAsync_RequestedInAsyncMode_NoWaitForComplete() throws Exception {

            // Creating nice mock - because we are not caring about methods call order
            mockStatic(MyCacheManager.class);

            // Setup
            final int operationTimeMilis = 5000;
            expect(MyCacheManager.getDetails(anyObject(String.class))).andStubAnswer(new IAnswer<Details>() {
                    public Details answer() {
                        try {
                            System.out.println("start waiting 5 sec");
                            System.out.println(Thread.currentThread().toString());
                            Thread.sleep(operationTimeMilis);
                            System.out.println("finished waiting 5 sec");
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        return Details.getEmpty();
                    }
                });

            replay(MyCacheManager.class);

            replayAll();

            ISchemaActionsContract controller = new TWManager();
            controller.refreshSchemaDetailsAsync("schema_id");

            // We need not to verify mocks, since all we are testing is timeout
            // verifyAll();
        }
    }
        ...

        Object res = null;
        FutureTask task = new FutureTask(new Runnable() {
                @Override
                public void run() {
                    MyCacheManager.getDetails(id);
                }
            }, res);            

        m_Log.debug("async mode - send request and do not wait for answer.");

        Executors.newCachedThreadPool().submit(task);