我建立了一个类与一对夫妇的测试,而不是使用@Before
我想有所有测试之前只执行一次设置方法。 这是可能使用JUnit 4.8?
Answer 1:
虽然我与@assylias同意使用@BeforeClass
是一个典型的解决方案并不总是方便。 带注释的方法@BeforeClass
必须是静态的。 这是一些测试需要测试案例实例非常不方便。 例如基于弹簧的使用测试@Autowired
与Spring上下文定义的服务工作。
在这种情况下,我个人使用常规setUp()
标注有方法@Before
注释和管理我的自定义static
(!) boolean
标志:
private static boolean setUpIsDone = false;
.....
public void setUp() {
if (setUpIsDone) {
return;
}
// do the setup
setUpIsDone = true;
}
Answer 2:
您可以使用该BeforeClass
注释 :
@BeforeClass
public static void setUpClass() {
//executed only once, before the first test
}
Answer 3:
JUnit的5现在有一个@BeforeAll注释:
表示该注释的方法应该在当前类或类层次所有@Test方法之前被执行; 类似于JUnit 4的@BeforeClass。 这样的方法必须是静态的。
JUnit的5的生命周期注解似乎终于得到了它的权利! 你能猜到这看也不看注解可用(例如@BeforeEach @AfterAll)
Answer 4:
当setUp()
是在测试类的父类,接受的答案可以作如下修改:
public abstract class AbstractTestBase {
private static Class<? extends AbstractTestBase> testClass;
.....
public void setUp() {
if (this.getClass().equals(testClass)) {
return;
}
// do the setup - once per concrete test class
.....
testClass = this.getClass();
}
}
这应该适用于一个单一的非静态setUp()
方法,但我无法产生一个相当于tearDown()
不误入复反射的世界......赏金点的人谁可以!
Answer 5:
编辑:我刚刚发现这是在调试类是每次测试之前实例化了。 我猜@BeforeClass注释是这里最好的。
您可以设置在构造过,测试类毕竟是一个类。 我不知道这是否是一种不好的做法,因为几乎所有的其他方法进行注释,但它的作品。 您可以创建这样一个构造函数:
public UT () {
// initialize once here
}
@Test
// Some test here...
该构造函数将在测试之前,因为它们不是静态的调用。
Answer 6:
尝试这种解决方案: https://stackoverflow.com/a/46274919/907576 :
与@BeforeAllMethods
/ @AfterAllMethods
注释,你可以在一个实例方面,所有注射值都可以执行在测试类中的任何方法。
Answer 7:
我肮脏的解决方案是:
public class TestCaseExtended extends TestCase {
private boolean isInitialized = false;
private int serId;
@Override
public void setUp() throws Exception {
super.setUp();
if(!isInitialized) {
loadSaveNewSerId();
emptyTestResultsDirectory();
isInitialized = true;
}
}
...
}
我用它作为基地基地,我所有的测试用例。
Answer 8:
如果你不希望强制将设置并在每个分测验检查变量的声明,然后添加这一个SuperTest可以这样做:
public abstract class SuperTest {
private static final ConcurrentHashMap<Class, Boolean> INITIALIZED = new ConcurrentHashMap<>();
protected final boolean initialized() {
final boolean[] absent = {false};
INITIALIZED.computeIfAbsent(this.getClass(), (klass)-> {
return absent[0] = true;
});
return !absent[0];
}
}
public class SubTest extends SuperTest {
@Before
public void before() {
if ( super.initialized() ) return;
... magic ...
}
}