我有一个JUnit测试类,它运行15个测试。 5个测试是可选的,因为我只希望在参数初始化特定变量时运行它们。如果变量值为null,我想忽略这些测试。这是可能的,如果是的话,怎么样?
答案 0 :(得分:3)
您可以使用JUnit4' Assume
功能......
能够针对当前编写的代码,隐式假设和所有代码运行测试,或编写暴露已知错误的测试,这是很好的。对于这些情况,JUnit现在包括表达"假设"
的能力
例如:
@Before
public void setUp() {
org.junit.Assume.assumeTrue(yourCondition());
// ...
}
如果yourCondition()
未返回true,则不会执行正在运行@Before
的测试。
答案 1 :(得分:2)
方法1:
您可以使用JUnit-ext。它具有RunIf
注释,可执行条件测试,例如:
@Test
@RunIf(DatabaseIsConnected.class)
public void calculateTotalSalary() {
//your code there
}
class DatabaseIsConnected implements Checker {
public boolean satisify() {
return Database.connect() != null;
}
}
方法2
另一种方法是使用Assume
。您可以使用@Before
方法或测试本身,但不能使用@After
方法。如果您在测试中执行此操作,则会运行@Before
方法。您也可以在@BeforeClass
内执行此操作以防止类初始化。例如:
@Before
public void beforeMethod() {
org.junit.Assume.assumeTrue(someCondition());
}
方法3
我认为另一个选择可能是创建一个注释来表示测试需要满足您的自定义条件,然后使用您自己的反射扩展默认运行器,根据自定义条件做出决定。它可能看起来像这样:
public class CustomRunner extends BlockJUnit4ClassRunner {
public CTRunner(Class<?> klass) throws initializationError {
super(klass);
}
@Override
protected boolean isIgnored(FrameworkMethod child) {
if(shouldIgnore()) {
return true;
}
return super.isIgnored(child);
}
private boolean shouldIgnore(class) {
/* some custom criteria */
}
}