java - 测试中的 If 语句

标签 java unit-testing

我有一个带有大量单元测试的参数化测试类,这些单元测试通常控制自定义电子邮件消息的创建。现在类有很多测试取决于参数化类中使用的因素,每个测试的测试流程都是相同的。测试示例:

@Test
public void testRecipientsCount() {
    assertEquals(3, recipientsCount);
}

我不得不向我的电子邮件类添加额外的功能,将一些额外的内部电子邮件添加到收件人列表中,这只发生在某些情况下,这导致了我的问题。

假设我想断言创建的消息数量。对于旧测试,每个案例都是相同的,但现在它因案例而异。对我来说最直观的方法是添加 if 语句:

@Test
public void testRecipientsCount(){
    if(something) {
        assertEquals(3, recipientsCount);
    }
    else {
        assertEquals(4, recipientsCount);
    }
}
...

但我更有经验的同事说我们应该避免在测试类中使用 if(我有点同意这一点)。

我认为对两个测试类进行拆分测试可能会起作用,但这会导致两个类中的冗余代码(我仍然必须检查是否创建了非内部消息、它们的大小、内容等),以及一些为其中之一添加的行。

我的问题是:我该怎么做才能不使用 if 或大量冗余代码(不使用参数化类会产生更多冗余代码)?

最佳答案

在我看来,Junit 应该像协议(protocol)一样阅读。 这意味着您可以编写冗余代码来提高测试用例的可读性。 为业务逻辑中每个可能的 if 语句以及否定案例编写一个测试用例。这是获得 100% 测试覆盖率的唯一方法。 我使用结构:

- testdata preparation
- executing logic
- check results
- clear data

此外,您应该在自己的抽象类中编写大对象的复杂断言:

abstract class YourBusinessObjectAssert{
  public static void assertYourBussinessObjectIsValid(YourBusinessObject pYourBusinessObject,       Collection<YourBusinessObject> pAllYourBusinessObject) {
for (YourBusinessObject lYourBusinessObject : pAllYourBusinessObject) {
  if (lYourBusinessObject.isTechnicalEqual(pYourBusinessObject)) {
    return;
  }
}
assertFalse("Could not find requested YourBusinessObject in List<YourBusinessObject>!", true);
}
}

它将降低代码的复杂性,并且您可以将其提供给其他开发人员。

关于java - 测试中的 If 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15154125/

相关文章:

java - 确定 Postscript 打印支持

每行都有 Java Eclipse 错误

java - Bundle 中值的 "Order"

xml - 规范用于 JUnit XML 输出

java - 使用 Mockito 模拟异常 : Unexpected Exception error

ruby-on-rails - 在Rails单元测试中,如何获取用户 fixture 来加载其关联的Profile?

java - 确保密码不包含字典单词

java - 无法摆脱著名的DataStreamer异常:org.apache.hadoop.ipc.RemoteException:错误

c# - 如何在最小起订量中调试验证?

c# - 我们应用程序中的主机单元测试框架? (Nunit、xUnit、MsTest)