2017-05-27 2 views
0

Ich habe eine Reihe von Code, um einen Job zu einer bestimmten Warteschlange innerhalb meiner @ Activate-Methode meiner Job-Klasse hinzuzufügen. Wenn ich JUnit für die Klasse ausführen, erhalte ich die Ausnahme nullPointer. PFB mein Code:Wie man JobBuilder.ScheduleBuilder.schedule() mit powerMockito mockt?

// MyJob.java 

public abstract class myJob implements JobExecutor{ 

private ScheduledJobInfo jobInfo; 
@Reference 
private JobManager jobManager; 

private String topicName = "abc/xyz"; 
private String cron= "0 0 0/12 ? * MON-FRI *"; 

// my activate method 
@Activate 
protected void activate(final Map<String, Object> config) { 
jobInfo = jobManager.createJob(topicName) 
       .properties(config) 
       .schedule() 
       .cron(cron).add();} 
} 

@Override 
public JobExecutionResult process(Job samplejob, JobExecutionContext samplecontext){ 
// logic inside process method 
return samplecontext.result().message("test message").succeeded(); 
} 

// meine JUnit-Testklasse

@RunWith(MockitoJUnitRunner.class) 
public class myJUnitTest{ 

@Mock 
private Job job1; 
@Mock 
private JobExecutionContext context1; 

@InjectMocks 
private myJob sampleObj = new MyJob(); 

@Test 
public void sampleActivate() throws Exception { 
    Map<String, Object> config = new HashMap<String, Object>(); 
    config.put("abc", "abc"); 

    sampleObj.activate(config); 
    sampleObj.process(job1, context1); 
} 

Meine Ergebnisse:
1. Während die JUnit deckt "jobManager.createJob (topicname) .properties (config)", Nullpointer wird geworfen, wenn der Fluss zu ".schedule()"
kommt 2. Ich kann "return samplecontext.result(). message (" test message "). succeed()" nicht abdecken, dort wird auch nullPointer geworfen .

Kann mir jemand dabei helfen? Vielen Dank im Voraus.

Antwort

0

Dieser Code mehrere Methoden in einer Kette von Anrufen ruft:

jobManager.createJob(topicName) 
       .properties(config) 
       .schedule() 
       .cron(cron).add(); 

So müssen Sie überlegen, was jede Methode zurückkehren wird. Zuerst wird die Methode createJob für das Objekt jobManager aufgerufen. Also, wenn Sie JobManager verspottet haben, können Sie Mockito when verwenden, um eine Erwartung dafür aufzustellen, was zurückgegeben werden soll, wenn diese Methode für das Objekt aufgerufen wird. Diese Methode sollte ein JobBuilder-Objekt zurückgeben, sodass Sie diese Erwartungen festlegen müssen. Dann können Sie auf dem JobBuilder, der von createJob zurückgegeben wird, die Erwartung festlegen, was von der properties-Methode zurückgegeben werden soll. Die properties-Methode gibt einen JobBuilder zurück, so dass Sie wieder when verwenden können, um diese Erwartung festzulegen.

Sobald dies eingestellt ist, können Sie die schedule() -Methode, die aufgerufen wird, austricksen. Ich nehme an, das ist nicht alles von Ihrem Code oder ich denke, Sie hätten eine Ausnahme bei der Verwendung von JobManager gefunden, da es nirgends in Ihrem Code als gespottet dargestellt wird.

Sie müssen wahrscheinlich so etwas wie die folgenden hinzuzufügen:

@Mock 
private JobManager jobManager; 

JobBuilder jobBuilder = Mockito.mock(JobBuilder.class); 

Mockito.when(jobManager.createJob("abc/xyz").thenReturn(jobBuilder); 

..und dann mehr von der gleichen die spöttischen für jede Methode, um fortzufahren, die aufgerufen wird. Jede aufgerufene Methode muss möglicherweise mokiert werden, so dass sie beim Aufruf das erwartete Objekt zurückgibt (was ein weiterer Schein sein kann).

Verwandte Themen