4

在编写单元测试时,我总是extends Assert,所以我可以无条件地访问对许多Assert.assertXXX方法的许多调用:

例如:

public class MyTestClass extends Assert {
    @Test
    public void SomeTest() {
        assertNotNull(""); // instead of Assert.assertNotNull("");
    }
}

扩展Assert节省了我的打字时间Assert.assertNotNull("");。在Assert.我看来,代码混乱,因为你经常使用它。

我的测试类很少需要扩展另一个类,如果需要,我倾向于让超类扩展 Assert。

然而,感觉就像我打破了一些编码风格来扩展只是为了避免导入和限定。

是这种“糟糕”的编码风格吗?
如果我这样做,它仍然是“最佳实践”代码吗,因为它只是一个测试类?

编辑:

import static org.junit.Assert.*;

不起作用,因为我的 Eclipse 代码格式化程序解析了所有导入,因此对于每次保存时实际使用的所有方法,这样的行会被替换并替换为单独的导入,如果我使用新的断言方法,则需要重新导入。

诚然,在编写测试类代码一段时间后,导入方法的需求减少了,但是在编写新测试类代码时却很麻烦。

4

6 回答 6

7

不,这样做:

import static org.junit.Assert.*;

public class MyTestClass {
   @Test
   public void SomeTest() {
       assertNotNull("");
   }
}
于 2012-12-23T18:59:22.840 回答
2

如果不需要,我个人不喜欢扩展课程。您是否考虑过使用您正在使用的方法的静态导入?在旁注中,我建议尝试 Fest 断言以获得更好、更易读的测试。

于 2012-12-23T18:59:46.357 回答
1

除非需要多态性,否则扩展类是不好的风格。这样做类似于 Sun 所说的Constant Interface Antipattern。正如您在该页面上看到的那样,静态导入语句被添加到语言中专门用于防止它。

就个人而言,我只是写Assert.assertNotNull(value)。这不是很多打字,我不觉得它会损害可读性。

如果您坚持使用不合格的方法,则应该使用静态导入来导入每个方法,因为以“*”结尾的导入语句也被认为是不良风格。如果其他人来维护您的代码(或者如果您在六个月后回来查看它),以“*”结尾的导入将需要维护者做一些侦探工作来找出方法来自哪里,而显式导入则可以立即明确该方法的来源。

于 2012-12-23T19:44:28.697 回答
1

我有同样的问题 - 但很容易解决:

像其他人说的那样使用:

import static org.junit.Assert.*;

public class MyTestClass {
   @Test
   public void SomeTest() {
       Assert.assertNotNull("");
   }
}

这是最重要的部分:

并转到:Window->Preferences,Java->Code Style->Organize Imports,“.* 所需的静态导入数(例如'java.lang.Math.*'):”-> 更改为 0。

现在您的代码格式化程序不会将“.*”导入更改为“单类”导入。

于 2012-12-23T19:52:48.377 回答
0

或者,如果您不喜欢 '.*'-imports:

Import static org.junit.Assert;

public class MyTestClass {
   @Test
   public void SomeTest() {
      Assert.assertNotNull("");
   }
}
于 2012-12-23T19:05:34.127 回答
0

首先:您在问这个问题,所以您也可以看到您的方式是错误的:) 正如每个人都告诉您的那样,应该使用静态导入来完成。这是正确的方法。时期。

正确的问题是如何让日食帮助你而不是干涉。至少有两种方法。首先,您可以在 eclipse 扩展 import xxx.* 时设置阈值。只需更改它,您就可以拥有您的 xxx.* 其他方式是将断言添加到您的上下文辅助中。这样,eclipse 将建议您使用您的断言,而无需先导入它们。

和我的方式:不要使用junit断言。使用 fest 断言 2.0。你可以静态导入 xxx.assertThat 就是这样。

于 2012-12-23T21:43:45.663 回答