【问题标题】:how to do junit test else branch of if如何做if的junit测试else分支
【发布时间】:2016-01-14 14:38:53
【问题描述】:

我正在尝试对该方法进行 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");

【问题讨论】:

    标签: java junit junit4 junit3


    【解决方案1】:

    如果可能,尝试使用接口来区分存根实现和默认实现。并且最好使用配置逻辑来“注入”正确的行为,或者使用工厂来生成请求的类实例。

    看这样的例子:

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

    BankDetailsS​​tubbedImpl.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();
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      如果stubbed 是类变量,则创建一个对象并将该变量设置为false。然后调用函数getQuestionBankDetails();。这样你就可以检查 else 部分了

      【讨论】:

        【解决方案3】:

        由于缺少代码,我假设您的 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);
            }
        }
        

        【讨论】:

          【解决方案4】:

          您需要编写一个单独的测试方法来测试 else 条件代码路径。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2022-01-13
            • 1970-01-01
            • 2011-06-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-03-20
            相关资源
            最近更新 更多