如何使用多个布尔字段对 class 进行单元测试

How to unit test a class with multiple boolean fields

抱歉,如果这是一个愚蠢的问题。我想对以下 class 进行单元测试(class 还有更多内容,但我将其剥离以说明我的问题)。

class 由在构造函数中分配的多个布尔字段组成。

当我进行单元测试时,我如何测试参数分配给正确的 class 字段,例如ans1 -> mIsOption1Ans ?

例如,如果我断言所有 class 字段都是 "true" 这将无法识别是否另一个开发人员不小心交换了构造函数中的赋值并将参数分配给了错误 class 字段。我想测试 "ans1" 总是被分配给 "mIsOption1Ans",等等,等等

public class MultipleChoiceQuizAnswer {
   private Boolean mIsOption1Ans,mIsOption2Ans,mIsOption3Ans,mIsOption4Ans;

   public QuizAnswer (Boolean ans1,Boolean ans2, Boolean ans3,Boolean ans4) {
         mIsOption1Ans = ans1;
         mIsOption2Ans = ans2;
         mIsOption3Ans = ans3;
         mIsOption4Ans = ans4;
    }
}

这是很明显的事情,但如果你真的想测试它,你可以测试每种情况,其中 1 个布尔值是 true,其余是 false

例如:

QuizAnswer firstTrue = QuizAnswer(true, false, false, false);
assertTrue(firstTrue.isFirstAnswer());
// Then for next:
QuizAnswer secondTrue = QuizAnswer(false, true, false, false);
assertTrue(secondTrue.isSecondAnswer());
// Etc. You could also check if all other answers are false

您的字段是对象的内部状态。您应该只测试 class' 对外界的行为。这些字段的值会导致 QuizAnswer 的一些外部行为,应该对其进行测试。例如。如果你有一个方法来检查一个选项是否是答案:

@Test
public void first_option_is_the_answer_when_ans1_flag_is_true() {
    QuizAnswer answer = new QuizAnswer(true, false, false, false);
    boolean firstOptionIsAnswer = answer.isNthOptionTheAnswer(1);
    assertTrue(firstOptionIsAnswer);
}

您可以查看 JUnit's Parameterized runner,因为您可能想要编写数据驱动测试。