Akash
Akash

Reputation: 840

how to do junit test else branch of if

I am trying to do Junit test for the method.

  public List<QuestionBank> getQuestionBankDetails(){
            if(stubbed){
                return (List<QuestionBank>) BeanPopulateUtils.getPopulateBeanValues(new QuestionBank(), true);
            }else{
                throw new NotImplementedException("Non-stubbed SOAP call not implemented");
            }
        }

This is my Junit case:

@Test
    public void testGetQuestionBankDetails(){
        List<QuestionBank> questionBankList = questionBankFacade.getQuestionBankDetails();
        int i=1;
         for(QuestionBank questionBank : questionBankList){
             assertEquals("Name "+i+"", questionBank.getName());
             assertEquals("Description "+i+"", questionBank.getDescription());
             assertEquals("Pubished Status "+i+" ", questionBank.getPubishedStatus());
             assertEquals("Questions "+i+"", questionBank.getQuestions());
             i++;
         }
    }

The Junit test case is getting success but the thing i want to ask is how i will test in 'else' case

Throw new NotImplementedException("Non-stubbed SOAP call not implemented");

Upvotes: 1

Views: 802

Answers (4)

bodo
bodo

Reputation: 847

Try to use if it possible interface to differentiate between stubbed and default implementation. And use preferably an configuration logic to "inject" correct behavior, or Factory to generate requested class instance.

See example like this:

BankDetails.class

package example;

import java.util.List;

public interface BankDetails {
    List<QuestionBank> getQuestionBankDetails();
}

BankDetailsDefaultImpl.class

package example;

import java.util.List;

public class BankDetailsDefaultImpl implements BankDetails {

    @Override
    public List<QuestionBank> getQuestionBankDetails() {
        return (List<QuestionBank>) BeanPopulateUtils.getPopulateBeanValues(new QuestionBank(), true);
    }

}

BankDetailsStubbedImpl.class

package example;

import java.util.List;

public class BankDetailsStubbedImpl implements BankDetails {

    @Override
    public List<QuestionBank> getQuestionBankDetails() {
        throw new NotImplementedException("Non-stubbed SOAP call not implemented");
    }

}

QuestionBankFacade.class

package example;

public class QuestionBankFacade {

    private final BankDetails bankDetails;

    public QuestionBankFacade(final BankDetails bankDetails) {
        this.bankDetails = bankDetails;
    }

    public BankDetails getQuestionBankDetails() {
        return this.getQuestionBankDetails();
    }

}

And finally the JUnit test:

QuestionBankFacadeTest.class

package example;

import static org.junit.Assert.*;

import java.util.List;

import org.apache.commons.lang.NotImplementedException;
import org.junit.Test;

public class QuestionBankFacadeTest {

    @Test
    public void testDefaultImplementation() {
        final QuestionBankFacade questionBankFacade = new QuestionBankFacade(new BankDetailsDefaultImpl());
        List<QuestionBank> questionBankList = questionBankFacade.getQuestionBankDetails();
        //Test case that you already have
//       for(QuestionBank questionBank : questionBankList){
//             assertEquals("Name "+i+"", questionBank.getName());
//             assertEquals("Description "+i+"", questionBank.getDescription());
//             assertEquals("Pubished Status "+i+" ", questionBank.getPubishedStatus());
//             assertEquals("Questions "+i+"", questionBank.getQuestions());
//             i++;
//         }
    }

    @Test(expected = NotImplementedException.class)
    public void testStubbedImplementation() {
        final QuestionBankFacade questionBankFacade = new QuestionBankFacade(new BankDetailsStubbedImpl());
        questionBankFacade.getQuestionBankDetails();
    }

}

Upvotes: 2

Mohit Sharma
Mohit Sharma

Reputation: 187

You need to write a separate test method which will tests the else condition code path.

Upvotes: 0

Harmlezz
Harmlezz

Reputation: 8068

Due to missing code I assume your QuestionBankFacade class looks like this:

private boolean stubbed;

public boolean isStubbed() {
    return stubbed;
}

public void setIsStubbed(boolean isStubbed) {
    this.stubbed = isStubbed;
}

public List<QuestionBank> getQuestionBankDetails() {
    if (stubbed) {
        return (List<QuestionBank>) BeanPopulateUtils.getPopulateBeanValues(new QuestionBank(), true);
    }
    throw new NotImplementedException("Non-stubbed SOAP call not implemented");
}

Than you may write a test like this:

@Test(expected=NotImplementedException.class)
public void getQuestionBankDetailsThrowsAnExceptionIfStubbed() {
    boolean memento = questionBankFacade.isStubbed();
    questionBankFacade.setIsStubbed(false);
    try {
        questionBankFacade.getQuestionBankDetails();
    } finally {
        questionBankFacade.setIsStubbed(memento);
    }
}

Upvotes: 0

Thanga
Thanga

Reputation: 8101

if stubbed is a class variable, Create an object and set the variable to false. then call the function getQuestionBankDetails();. That way you can check the else part

Upvotes: 0

Related Questions