Как сделать тест Junit еще филиал, если

Я пытаюсь сделать тест Junit для метода.

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

Это мой случай с Junit:

@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++;
         }
    }

Тестовый пример Junit становится успешным, но я хочу спросить, как я буду тестировать в другом случае

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

4 ответа

Попробуйте использовать, если возможно, интерфейс, чтобы различать заглушку и реализацию по умолчанию. И предпочтительно использовать логику конфигурации, чтобы "внедрить" правильное поведение, или Factory, чтобы сгенерировать запрошенный экземпляр класса.

Смотрите пример, как это:

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();
    }

}

И, наконец, тест JUnit:

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();
    }

}

Вам нужно написать отдельный метод тестирования, который будет проверять путь кода условия else.

Если stubbed переменная класса, создайте объект и установите для переменной значение false. затем вызовите функцию getQuestionBankDetails();, Таким образом, вы можете проверить остальную часть

Из-за отсутствия кода я предполагаю, что ваш QuestionBankFacade класс выглядит так:

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");
}

Чем вы можете написать такой тест:

@Test(expected=NotImplementedException.class)
public void getQuestionBankDetailsThrowsAnExceptionIfStubbed() {
    boolean memento = questionBankFacade.isStubbed();
    questionBankFacade.setIsStubbed(false);
    try {
        questionBankFacade.getQuestionBankDetails();
    } finally {
        questionBankFacade.setIsStubbed(memento);
    }
}
Другие вопросы по тегам