Search code examples
javajunitmockitopowermockito

How to write junit test case for thread run method


I have public void run() method. Inside of run method i'm calling three(CurrentDate,generateReport and update) more methods like below. My doubt is, for run method i don't have any parameter to pass Details object. How to pass Details object to run method from junit test method. I have googled lot but no solution.

@Override
public void run() {

    while(true) { 
        Details Obj = ruleQueue.peek();
        if(Obj != null && CurrentDate(Obj)) {
            ruleQueue.poll();

            Generator generator = new Generator();
            generator.generateReport(Obj.getId(),Obj.getLastExec(), ruleObj.getnextExec());

            updateDate(Obj);
            try {
                dao.update(Obj);

            }
            catch (DocumentClientException e) {
                logger.error(e);
            }
        }
    }
}

Solution

  • You can't pass any arguments to the overridden run method. If you pass it's no longer overridden it's overloaded.

    So better use the Thread constructor to share objects:

    class MyThread implements Runnable{
    
        private Details details;
    
        public MyThread(Details details){
            this.details = details;
        }
    
    
        @Override
        public void run(){
    
            // Use details here
        }
    
    }
    

    For testing or calling this Thread:

    Details details = new Details();
    MyThread t = new Mythread(details);
    t.start();