package org.jooby.internal.quartz;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import org.jooby.test.MockUnit;
import org.junit.Test;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import com.google.inject.Injector;
public class ReflectiveJobTest {
public interface MyJob {
void run(JobExecutionContext ctx);
}
public interface MyJobWithReturnType {
Object run();
}
@Test(expected = NullPointerException.class)
public void shouldFailOnNullInjector() {
new ReflectiveJob(null);
}
@Test
public void shouldExecuteJob() throws Exception {
new MockUnit(Injector.class, JobExecutionContext.class)
.expect(unit -> {
Runnable runnable = unit.mock(Runnable.class);
runnable.run();
Injector injector = unit.get(Injector.class);
expect(injector.getInstance(Runnable.class)).andReturn(runnable);
})
.expect(unit -> {
JobKey key = JobKey.jobKey("Runnable.run", "java.lang");
JobDetail job = unit.mock(JobDetail.class);
expect(job.getKey()).andReturn(key);
JobExecutionContext ctx = unit.get(JobExecutionContext.class);
expect(ctx.getJobDetail()).andReturn(job);
})
.run(unit -> {
new ReflectiveJob(unit.get(Injector.class)).execute(unit.get(JobExecutionContext.class));
});
}
@Test
public void shouldExecuteWithArgument() throws Exception {
new MockUnit(Injector.class, JobExecutionContext.class)
.expect(unit -> {
MyJob runnable = unit.mock(MyJob.class);
runnable.run(unit.get(JobExecutionContext.class));
Injector injector = unit.get(Injector.class);
expect(injector.getInstance(MyJob.class)).andReturn(runnable);
})
.expect(unit -> {
JobKey key = JobKey.jobKey("ReflectiveJobTest$" + MyJob.class.getSimpleName()
+ ".run", ReflectiveJob.class.getPackage().getName());
JobDetail job = unit.mock(JobDetail.class);
expect(job.getKey()).andReturn(key);
JobExecutionContext ctx = unit.get(JobExecutionContext.class);
expect(ctx.getJobDetail()).andReturn(job);
})
.run(unit -> {
new ReflectiveJob(unit.get(Injector.class)).execute(unit.get(JobExecutionContext.class));
});
}
@Test
public void shouldExecuteAndSaveResult() throws Exception {
new MockUnit(Injector.class, JobExecutionContext.class)
.expect(unit -> {
MyJobWithReturnType runnable = unit.mock(MyJobWithReturnType.class);
expect(runnable.run()).andReturn("xxx");
Injector injector = unit.get(Injector.class);
expect(injector.getInstance(MyJobWithReturnType.class)).andReturn(runnable);
})
.expect(
unit -> {
JobKey key = JobKey.jobKey(
"ReflectiveJobTest$" + MyJobWithReturnType.class.getSimpleName()
+ ".run", ReflectiveJob.class.getPackage().getName());
JobDetail job = unit.mock(JobDetail.class);
expect(job.getKey()).andReturn(key);
JobExecutionContext ctx = unit.get(JobExecutionContext.class);
expect(ctx.getJobDetail()).andReturn(job);
ctx.setResult("xxx");
})
.run(unit -> {
new ReflectiveJob(unit.get(Injector.class)).execute(unit.get(JobExecutionContext.class));
});
}
@Test(expected = JobExecutionException.class)
public void shouldCatchInvocationExceptionAndRethrowCause() throws Exception {
new MockUnit(Injector.class, JobExecutionContext.class)
.expect(unit -> {
Runnable runnable = unit.mock(Runnable.class);
runnable.run();
expectLastCall().andThrow(new RuntimeException("intentional err"));
Injector injector = unit.get(Injector.class);
expect(injector.getInstance(Runnable.class)).andReturn(runnable);
})
.expect(unit -> {
JobKey key = JobKey.jobKey("Runnable.run", "java.lang");
JobDetail job = unit.mock(JobDetail.class);
expect(job.getKey()).andReturn(key);
JobExecutionContext ctx = unit.get(JobExecutionContext.class);
expect(ctx.getJobDetail()).andReturn(job);
})
.run(unit -> {
new ReflectiveJob(unit.get(Injector.class)).execute(unit.get(JobExecutionContext.class));
});
}
@Test(expected = JobExecutionException.class)
public void shouldCatchExceptionAndRethrow() throws Exception {
new MockUnit(Injector.class, JobExecutionContext.class)
.expect(unit -> {
Injector injector = unit.get(Injector.class);
expect(injector.getInstance(Runnable.class)).andReturn(null);
})
.expect(unit -> {
JobKey key = JobKey.jobKey("Runnable.run", "java.lang");
JobDetail job = unit.mock(JobDetail.class);
expect(job.getKey()).andReturn(key);
JobExecutionContext ctx = unit.get(JobExecutionContext.class);
expect(ctx.getJobDetail()).andReturn(job);
})
.run(unit -> {
new ReflectiveJob(unit.get(Injector.class)).execute(unit.get(JobExecutionContext.class));
});
}
}