2016-04-19 21 views
0

在断言中使用常量的主题类被认为是不好的做法吗?在测试类中使用断言中的主题类的常量是否是一个好主意?

@Test 
public void testSubjectMethod() throws Exception { 
    Subject subject = new Subject() 

    String result = subject.subjectMethod(); 

    Assert.assertEquals(result, Subject.VALUE); 
} 

或者我应该在测试类中保留一个单独的值并使用它?

private static final String SUBJECT_VALUE = "SUBJECT_VALUE"; 

@Test 
public void testSubjectMethod() throws Exception { 
    Subject subject = new Subject() 

    String result = subject.subjectMethod(); 

    Assert.assertEquals(result, SUBJECT_VALUE); 
} 
+0

除了明显违反DRY和创建微妙错误雷区的重复以外,你认为你正在用这样的数据复制完成什么。 –

回答

1

是的,你的测试,利用主题类常量的原因有两个:

  • 在整个测试中使用恒定的保证,如果你改变了常量的值,可以更改它无处不在。相反,如果您在每个测试中重复了该值,则可能只更新一次该值而不是另一次,并且可能会导致未更新的测试通过,如果不应该,则会发生错误。这种考虑实际上只需要你在整个测试中使用相同的常量,而不是在你的测试和科目类中它们是相同的常量,但是如果你在课程类中有常量,那么你也可以在测试中使用它。

  • 该常数明确表示该值对于程序以及如何使用它很重要。命名常量的方式使得他们在测试中的角色,而不仅仅是他们在实现中的角色。在测试中使用它们会给命名带来正面的压力。

然而,

  • 不要使用从随便一个类中的常量在测试中:主题类可能使用常量从另一个类,你可能需要的该值在主题类的测试中不变。但是,如果没有其他理由在你的测试中提及其他类别,那么不要仅仅为了恒定而去做;这会不必要地将测试和实施结合起来。如果你不想引用的类有一个你不想复制的有意义的常量,把它移到你不介意引用的类(可能是测试的主题)或新的常量类,并从那里使用它。

  • 不要在测试中使用提供主题类行为的复杂部分的常量。这样做会使测试仅仅是实施的副本,从而降低了测试的能力。例如,在测试中使用主题类中使用的正则表达式常量可能不是一个好主意。相反,编写测试表明类使用正确的输入做了正确的事情,如果您重写了不使用正则表达式的类,那么仍会通过测试。

+1

我不明白“不要使用不会在测试中引用的实现类中的常量”。你能否试着用另一种方式来陈述它? – mattalxndr

+0

修订。怎么样? –

+0

修订版似乎暗示:“在您的测试中遵循德米特法则。” – jaco0646

相关问题